このバージョンはまだ開発中であり、まだ安定しているとは見なされていません。最新の安定バージョンについては、Spring Framework 6.2.2 を使用してください!

例外

@Controller および @ControllerAdvice クラスには、コントローラーメソッドからの例外を処理する @ExceptionHandler メソッドを含めることができます。次の例には、このようなハンドラーメソッドが含まれています。

  • Java

  • Kotlin

import java.io.IOException;

import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;

@Controller
public class SimpleController {

	@ExceptionHandler(IOException.class)
	public ResponseEntity<String> handle() {
		return ResponseEntity.internalServerError().body("Could not read file storage");
	}

}
import org.springframework.http.ResponseEntity
import org.springframework.stereotype.Controller
import org.springframework.web.bind.annotation.ExceptionHandler
import java.io.IOException

@Controller
class SimpleController {

	@ExceptionHandler(IOException::class)
	fun handle() : ResponseEntity<String> {
		return ResponseEntity.internalServerError().body("Could not read file storage")
	}
	
}

例外は、伝播されるトップレベルの例外(つまり、直接 IOException がスローされる)、トップレベルのラッパー例外内の直接の原因(たとえば、IllegalStateException 内にラップされた IOException)に一致します。

例外型を一致させるには、前の例に示すように、ターゲット例外をメソッド引数として宣言することが望ましいです。あるいは、アノテーション宣言により、一致する例外型を絞り込むこともできます。一般に、引数のシグネチャーをできるだけ具体的にし、対応する順序で優先順位を付けた @ControllerAdvice 上でプライマリルート例外マッピングを宣言することをお勧めします。詳細については、"MVC" セクションを参照してください。

WebFlux の @ExceptionHandler メソッドは、@RequestMapping メソッドと同じメソッド引数と戻り値をサポートしていますが、リクエスト本体および @ModelAttribute 関連のメソッド引数は例外です。

Spring での @ExceptionHandler メソッドのサポート WebFlux は、@RequestMapping メソッドの HandlerAdapter によって提供されます。詳細については、DispatcherHandler を参照してください。

メディア型のマッピング

例外型に加えて、@ExceptionHandler メソッドは生成可能なメディア型も宣言できます。これにより、通常は "Accept" HTTP リクエストヘッダーで HTTP クライアントによってリクエストされたメディア型に応じてエラーレスポンスを調整できます。

アプリケーションは、同じ例外型に対して、生成可能なメディア型をアノテーション上で直接宣言できます。

  • Java

  • Kotlin

@ExceptionHandler(produces = "application/json")
public ResponseEntity<ErrorMessage> handleJson(IllegalArgumentException exc) {
	return ResponseEntity.badRequest().body(new ErrorMessage(exc.getMessage(), 42));
}

@ExceptionHandler(produces = "text/html")
public String handle(IllegalArgumentException exc, Model model) {
	model.addAttribute("error", new ErrorMessage(exc.getMessage(), 42));
	return "errorView";
}
@ExceptionHandler(produces = ["application/json"])
fun handleJson(exc: IllegalArgumentException): ResponseEntity<ErrorMessage> {
	return ResponseEntity.badRequest().body(ErrorMessage(exc.message, 42))
}

@ExceptionHandler(produces = ["text/html"])
fun handle(exc: IllegalArgumentException, model: Model): String {
	model.addAttribute("error", ErrorMessage(exc.message, 42))
	return "errorView"
}

ここでは、メソッドは同じ例外型を処理しますが、重複として拒否されることはありません。代わりに、"application/json" をリクエストする API クライアントは JSON エラーを受け取り、ブラウザーは HTML エラービューを取得します。各 @ExceptionHandler アノテーションは、生成可能なメディア型をいくつか宣言できます。エラー処理フェーズでのコンテンツネゴシエーションによって、どのコンテンツ型が使用されるかが決定されます。

メソッド引数

@ExceptionHandler メソッドは、@RequestMapping メソッドと同じメソッド引数をサポートしますが、リクエスト本文がすでに使用されている可能性があります。

戻り値

@ExceptionHandler メソッドは、@RequestMapping メソッドと同じ戻り値をサポートします。