このバージョンはまだ開発中であり、まだ安定しているとは見なされていません。最新の安定バージョンについては、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
メソッドと同じ戻り値をサポートします。