7

次のような例外クラスがあります

@ResponseStatus(value=HttpStatus.UNPROCESSABLE_ENTITY, reason="Unprocessable Entity")  // 422
public class UnprocessableEntityException extends RuntimeException {
}

Controller クラスに次のような特定のハンドラを記述しない限り、ステータスは 422 として返されません。

@ExceptionHandler(UnprocessableEntityException.class)
    @ResponseStatus(HttpStatus.UNPROCESSABLE_ENTITY)
    public String handleException(Exception ex) {
...
}

私が理解しているように、最初に @ExceptionHandler を必要とすべきではありません。何が欠けているのかわかりません。

4

2 に答える 2

2

フレームワークが HTTP ステータス コードを書き込むには、コントローラー メソッドから注釈付きの例外をスローする@ResponseStatusだけで十分です。必要ありませ@ExceptionHandlerん。

以下は、期待どおりに webapp ルートにヒットしたときに 422 ステータスを書き込みます。

@Controller
public class ExceptionController {

    @RequestMapping("/")
    public void action() {
        throw new ActionException();
    }

    @ResponseStatus(value = HttpStatus.UNPROCESSABLE_ENTITY, reason = "nope")
    public static class ActionException extends RuntimeException {}
}

これResponseStatusExceptionResolverは、Spring MVC によってデフォルトで作成された のおかげで機能します。うまくいかない場合は、このデフォルトの例外リゾルバーが削除されていると思います (たとえばWebMvcConfigurationSupport.configureHandlerExceptionResolvers、コンテキストの をオーバーライドするか、その他の方法で構成HandlerExceptionResolverして、ResponseStatusExceptionResolverを切り捨てます)。

于 2015-12-03T22:14:49.003 に答える