【问题标题】:Spring does not render custom error page for uncaught exceptionSpring 不会为未捕获的异常呈现自定义错误页面
【发布时间】:2021-03-10 15:29:05
【问题描述】:

我正在尝试修复我们的 Spring Web 应用程序,该应用程序无法正确显示未捕获的异常错误。 (几年没做)它只是显示html代码,而不是渲染它。 ResourceNotFound 等其他错误很好地显示了他们的自定义错误页面。

据我了解,在 WEB-INF/web.xml 中是这样的:

<error-page>
    <location>/uncaughtException</location>
</error-page>

那个东西将它路由到控制器,UncaughtExceptionViewController:

@RequestMapping("/uncaughtException")
@Controller
public class UncaughtExceptionViewController {

    @RequestMapping
    public String uncaughtException() {
        return "uncaughtException";
    }
}

然后转到相应的views.xml:

<definition extends="basePage" name="uncaughtException">
    <put-attribute name="body" value="/WEB-INF/views/uncaughtExceptionWorkaround.jspx"/>
</definition>

我已经搞砸了 basePage 和 uncaughtExceptionWorkaround.jspx (基本上将它们简化为干净的&lt;html&gt;&lt;body&gt;&lt;/body&gt;&lt;/html&gt;),我认为错误不在其中。它们的代码内容显示在屏幕上。

它确实会在控制器中遇到断点。也例如我们的 ResourceNotFoundViewController 完美运行,并且非常相似:

<error-page>
    <error-code>404</error-code>
    <location>/resourceNotFound</location>
</error-page>

'

@RequestMapping("/resourceNotFound")
@Controller
public class ResourceNotFoundViewController {

    @RequestMapping
    public String resourceNotFound() {
        return "resourceNotFound";
    }
}

我尝试向 applicationContext-security.xml 添加内容

<intercept-url pattern="/uncaughtException" access="permitAll"/>

并修改控制器注释,如:

 @RequestMapping(produces = "text/html")

我还尝试将位置更改为“/uncaughtException2”和this,但问题仍然存在。

未捕获的异常和有效的东西之间的一个区别是 webmvc-config.xml 中的这个 bean:

<bean class="se.justLog.server.spring.LoggingExceptionResolver" p:defaultErrorView="uncaughtException">
    <property name="exceptionMappings">
        <props>
            <prop key=".DataAccessException">dataAccessFailure</prop>
            <prop key=".NoSuchRequestHandlingMethodException">resourceNotFound</prop>
            <prop key=".TypeMismatchException">resourceNotFound</prop>
            <prop key=".MissingServletRequestParameterException">resourceNotFound</prop>
            <prop key=".ResetPasswordException">resetpasswordfailed</prop>
        </props>
    </property>
</bean>

我尝试添加 .RuntimeException 以查看是否有任何不同,但没有。

有趣!如果我删除整个 LoggingExceptionResolver(这是一个 SimpleMappingExceptionResolver)bean,然后 HTML 呈现,但 .jspx 页面中的异常变量变为空,因此它不显示错误。

这个非常有趣,你有什么想法吗? (我不是 Spring 专家,是否有一些我遗漏了调查的步骤?)

编辑:Spring 没有添加 Content-type: text/html 标头,这是问题所在。

【问题讨论】:

    标签: spring spring-mvc


    【解决方案1】:

    你可以试试 Spring 的@ControllerAdvice

    @ControllerAdvice 注释允许您处理整个应用程序的异常,而不仅仅是单个控制器。你可以把它看成是由@RequestMapping注解的方法抛出的异常的拦截器。这是处理异常和错误的好方法。

    @ControllerAdvice
    public class ExceptionControllerAdvice {
    
        @ExceptionHandler(Exception.class)
        public ModelAndView uncaughtException(Exception e) {
            
            ModelAndView mav = new ModelAndView("uncaughtException");
            mav.addObject("name", e.getClass().getSimpleName());
            mav.addObject("message", e.getMessage());
    
            return mav;
        }
    }
    

    uncaughtException.jsp

    <html>
    <head>
        <title>Internal Server Error</title>    
    </head>
    <body>
        <h1>Ops! Something went wrong</h1>
        <b>${name}</b>:  ${message}
    </body>
    </html>
    

    【讨论】:

      猜你喜欢
      • 2015-07-05
      • 2015-03-20
      • 2022-11-10
      • 2016-05-02
      • 1970-01-01
      • 2017-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多