带有自定义异常类的 Spring REST @ResponseStatus 不会更改返回状态代码

exp*_*rer 7 spring-rest

我有一个如下所示的异常类

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

现在状态不会返回为 422,除非我在 Controller 类中编写了一个特定的处理程序,例如:

@ExceptionHandler(UnprocessableEntityException.class)
    @ResponseStatus(HttpStatus.UNPROCESSABLE_ENTITY)
    public String handleException(Exception ex) {
...
}
Run Code Online (Sandbox Code Playgroud)

据我了解,我首先不需要@ExceptionHandler,不确定我错过了什么。

rya*_*anp 3

从控制器方法抛出@ResponseStatus带注释的异常应该足以让框架编写 HTTP 状态代码 - 没有@ExceptionHandler必要。

以下内容将按预期在访问 webapp 根目录时写入 422 Status:

@Controller
public class ExceptionController {

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

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

这得益于ResponseStatusExceptionResolverSpring MVC 默认创建的 s - 如果它不适合你,我的猜测是这个默认的异常解析器已被删除(例如通过覆盖WebMvcConfigurationSupport.configureHandlerExceptionResolvers或以其他方式配置你的上下文的HandlerExceptionResolvers ,以便 sResponseStatusExceptionResolver被击败。)