7

我有一个如下异常类

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

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

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

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

4

2 回答 2

2

从控制器方法中抛出带@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或以其他方式配置您的上下文的HandlerExceptionResolvers 以便ResponseStatusExceptionResolver胜过。)

于 2015-12-03T22:14:49.003 回答
1

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

于 2017-11-06T05:50:46.787 回答