我有一个 Spring MVC 应用程序,我想要针对某些错误有一个自定义错误页面。例如,404 和 500。
现在,我的应用程序可以在某种情况下抛出导致 500 状态代码的异常。如果没有自定义错误页面,它看起来像这样:
现在我想要一个自定义错误页面,所以我应用以下
web.xml
文件:
<web-app>
<error-page>
<error-code>404</error-code>
<location>/error404</location>
</error-page>
<error-page>
<error-code>400</error-code>
<location>/error400</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/error500</location>
</error-page>
</web-app>
还有以下
ErrorController
@Controller
public class ErrorController {
@GetMapping("/error404")
public String error404() {
return "html/error404";
}
@GetMapping("/error500")
public String error500() {
return "html/error500";
}
}
404 效果很好 - 如果我尝试浏览到
http://localhost:8080/my-app/non-existing-url
,我会收到自定义 404 错误页面。
但是,当我导致应用程序抛出导致上面返回 500 的相同异常时,我没有得到自定义页面。相反,我得到:
有人可以帮我理解为什么吗?!
然后,如果我启用自定义错误页面,我确实会得到自定义错误页面。因此,对于特定的例外情况,它似乎确实有效,但对于其他例外情况,则不然。这背后的逻辑是什么?
只是想问一个显而易见的问题:您确定没有任何东西可以覆盖 500 错误吗?(或者在其他地方捕获它?)
如果没有,让我们尝试设置我们自己的(非 xml)ExceptionHandler:
@ControllerAdvice
class GlobalControllerExceptionHandler {
@ExceptionHandler(RuntimeException.class)
public ModelAndView defaultErrorHandler() {
ModelAndView mav = new ModelAndView();
mav.setViewName("html/error500");
return mav;
}
}
这基本上应该总是有效的,因为我们正在抓住一切,那是
RuntimeException
的子项,而你的 DuplicateKeyException
就是。
如果它没有按预期工作,那么您可以尝试将异常范围缩小到
DataIntegrityViolationException
甚至您的 DuplicateKeyException
。
这个主要基于https://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc