1

我正在使用 Spring 3.2.1 并且有一个PropertyEditorSupport强制参数我想自动转换为大写的枚举,以便它转换错误大小写的参数。如果IllegalArgumentException参数 String 无法转换为枚举,则可以抛出一个。我的问题是状态码在应该是 400 时返回为 500。我创建了一个ResponseEntityExceptionHandler带有注释@ControllerAdvice的方法和一个方法 annotated @ExceptionHandler (IllegalArgumentException.class),打算在那里设置状态码,但是当抛出异常时该方法永远不会被调用。为什么不?和这里讨论的问题一样吗,MaxUploadSizeExceededException 没有调用 Spring 中的异常处理方法?IE

“...在请求到达调度程序 servlet 之前引发异常。因此,您的异常处理程序不会被调用,因为在引发异常时目标控制器尚未确定。”

如果是这样,我怎样才能返回正确的状态码?

4

1 回答 1

0

精简版:

@ExceptionHandler(Exception)带注释的方法放在@Controller类中。


更长的版本:

我注意到类中的带@ExceptionHandler(XxxException.class)注释的方法只有在“在”使用 match 输入方法之后@ControllerAdvice才会被调用。XxxException@RequestMapping

MaxUploadSizeExceededException和之类的条件MethodArgumentNotValidException会导致 SpringMVC 不进入@RequestMapping方法,因此不应用建议。

我的解决方案是遗憾地将@ExceptionHandler(XxxException.class)带注释的方法放在实际的控制器类中。不好但有效。

希望这可以帮助。如果有人知道更好的解决方案(使用时@ControllerAdvice),请分享。

于 2013-12-17T14:45:14.020 回答