Spring MVC - 自定义错误页面不起作用

问题描述 投票:0回答:1

我有一个 Spring MVC 应用程序,我想要针对某些错误有一个自定义错误页面。例如,404 和 500。

现在,我的应用程序可以在某种情况下抛出导致 500 状态代码的异常。如果没有自定义错误页面,它看起来像这样:

enter image description here

现在我想要一个自定义错误页面,所以我应用以下

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 的相同异常时,我没有得到自定义页面。相反,我得到:

enter image description here

有人可以帮我理解为什么吗?!

编辑

我发现当抛出另一个导致 500 的异常时: enter image description here

然后,如果我启用自定义错误页面,我确实会得到自定义错误页面。因此,对于特定的例外情况,它似乎确实有效,但对于其他例外情况,则不然。这背后的逻辑是什么?

java spring-mvc servlets
1个回答
0
投票

只是想问一个显而易见的问题:您确定没有任何东西可以覆盖 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

© www.soinside.com 2019 - 2024. All rights reserved.