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

时间:2015-12-03 19:45:05

标签: spring-rest

我有一个异常类,如下面的

@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,不知道我错过了什么。

2 个答案:

答案 0 :(得分:0)

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

以下内容将按预期命中webapp root写入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 {}
}

由默认情况下由Spring MVC创建的ResponseStatusExceptionResolver提供 - 如果它不适合你,我的猜测是这个默认的异常解析器已被删除(例如覆盖{{ 1}}或以其他方式配置您的上下文的WebMvcConfigurationSupport.configureHandlerExceptionResolvers以便HandlerExceptionResolver被打破。)

答案 1 :(得分:0)

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