Spring 具有自定义异常的 REST @ResponseStatus class 不会更改 return 状态代码

Spring REST @ResponseStatus with Custom exception class does not change the return Status code

我有一个例外 class 如下

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

现在状态不会返回为 422,除非我在控制器中编写特定的处理程序 class,例如:

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

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

从控制器方法中抛出 @ResponseStatus 带注释的异常应该足以让框架编写 HTTP 状态代码 - 不需要 @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 被压倒。)

抛出的异常不应由代码或其他异常解析器处理,例如它不应由 @ExceptionHandler 处理,因为这将覆盖异常指定的状态代码 class的@ResponseStatus.