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
.
我有一个例外 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
.