gpt4 book ai didi

java - 如何处理在 Spring MVC 中渲染 View 时引发的异常?

转载 作者:IT老高 更新时间:2023-10-28 13:46:30 26 4
gpt4 key购买 nike

我有一个 Spring MVC 应用程序,它使用 FreeMarker 作为 View 技术(但也许 View 技术对我的问题并不重要)。我需要拦截在请求期间可能引发的所有异常。

我已经实现了 HandlerExceptionResolver但是这个解析器只有在 Controller 内发生异常时才会执行。但是,当 Controller 返回 ModelAndView 并且在渲染 View 时发生异常(因为未找到变量或类似情况),则不会调用异常解析器,而是在浏览器窗口中获得堆栈跟踪。

我还尝试在 Controller 中使用异常处理程序方法,该方法返回 View 并使用 @ExceptionHandler 对其进行注释,但这也不起作用(很可能再次因为异常不是在 Controller 中而是在 View 中引发)。

那么有一些 Spring 机制可以让我注册一个捕获 View 错误的异常处理程序吗?

最佳答案

提前说一句:如果您只需要一个“静态”错误页面而没有太多逻辑和模型准备,那么放置 <error-page> 就足够了-标记您的web.xml (参见下面的示例)。

否则,可能有更好的方法来做到这一点,但这对我们有用:

我们使用一个 servlet <filter>web.xml它捕获所有异常并调用我们的自定义 ErrorHandler,我们在 Spring HandlerExceptionResolver 中使用的相同。

<filter>
<filter-name>errorHandlerFilter</filter-name>
<filter-class>org.example.filter.ErrorHandlerFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>errorHandlerFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

实现基本上是这样的:

public class ErrorHandlerFilter implements Filter {

ErrorHandler errorHandler;

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
try {
filterChain.doFilter(request, response);
} catch (Exception ex) {
// call ErrorHandler and dispatch to error jsp
String errorMessage = errorHandler.handle(request, response, ex);
request.setAttribute("errorMessage", errorMessage);
request.getRequestDispatcher("/WEB-INF/jsp/error/dispatch-error.jsp").forward(request, response);
}

@Override
public void init(FilterConfig filterConfig) throws ServletException {
errorHandler = (ErrorHandler) WebApplicationContextUtils
.getRequiredWebApplicationContext(filterConfig.getServletContext())
.getBean("defaultErrorHandler");
}

// ...
}

我相信这对于 FreeMarker 模板应该几乎是一样的。当然,如果你的错误 View 抛出一个错误,你或多或少是没有选择的。

为了同时捕捉 404 之类的错误并为其准备模型,我们使用映射到 ERROR 的过滤器。调度员:

<filter>
<filter-name>errorDispatcherFilter</filter-name>
<filter-class>org.example.filter.ErrorDispatcherFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>errorDispatcherFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>ERROR</dispatcher>
</filter-mapping>

<error-page>
<error-code>404</error-code>
<location>/WEB-INF/jsp/error/dispatch-error.jsp</location>
</error-page>
<error-page>
<exception-type>java.lang.Exception</exception-type>
<location>/WEB-INF/jsp/error/dispatch-error.jsp</location>
</error-page>

doFilter-Implementation 如下所示:

@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

final HttpServletRequest request = (HttpServletRequest) servletRequest;

// handle code(s)
final int code = (Integer) request.getAttribute("javax.servlet.error.status_code");
if (code == 404) {
final String uri = (String) request.getAttribute("javax.servlet.error.request_uri");
request.setAttribute("errorMessage", "The requested page '" + uri + "' could not be found.");
}

// notify chain
filterChain.doFilter(servletRequest, servletResponse);
}

关于java - 如何处理在 Spring MVC 中渲染 View 时引发的异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11245932/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com