当我使用基于控制器的spring异常处理程序时,它无法正常工作。
我的代码在这里:
{{1}}
应用程序启动调试模式后,访问http://localhost:8080/page, handleException 一直在运行,视图低于预期。为什么?
答案 0 :(得分:1)
问题在于@ResponseStatus注释。请查看以下文章:http://blog.sizovs.net/spring-rest-exception-handler/。在本文的中间,作者说:
警告:在异常类上使用此批注时,或者在设置此批注的reason属性时,将使用HttpServletResponse.sendError方法。 使用HttpServletResponse.sendError,响应被认为是完整的,不应再写入。此外,Servlet容器通常会编写HTML错误页面,因此会使用不适合REST API的原因。对于这种情况,最好使用org.springframework.http.ResponseEntity作为返回类型,并且完全避免使用@ResponseStatus。
根据一篇Spring文章:https://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc Spring MVC按照以下顺序链接以下三个解析器:
- ExceptionHandlerExceptionResolver将未捕获的异常与处理程序(控制器)和任何控制器建议上的合适@ExceptionHandler方法进行匹配。
- ResponseStatusExceptionResolver查找由@ResponseStatus注释的未捕获异常(如第1部分所述)
- DefaultHandlerExceptionResolver转换标准的Spring异常并转换它们 到HTTP状态代码(我之前没有提到它,因为它是Spring MVC的内部代码)。
因此在ExceptionHanlderExceptionResolver之后触发ResponseStatusExceptionResolver并使用默认值并显示Spring的错误页面。
要快速修复,请尝试删除@ResponseStatus,您应该会在浏览器中看到自定义错误页面。