在Spring MVC中渲染视图时如何处理抛出的异常?

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

我已经实现了HandlerExceptionResolver,但是仅当控制器内发生异常时才执行此解析器。但是,当控制器返回ModelAndView且呈现视图时发生异常(因为未找到变量或类似的东西),则未调用异常解析器,而是在浏览器窗口中获取了堆栈跟踪。

我还尝试在控制器中使用异常处理程序方法,该方法返回视图并使用@ExceptionHandler对其进行注释,但这也不起作用(很可能再次出现,因为异常不是在控制器中而是在视图中抛出)。

那么是否有一些Spring机制可以注册捕获视图错误的异常处理程序?

回答:

一个简单的词:如果你只需要一个“静态”错误页面而没有太多的逻辑和模型准备,那么<error-page>在你的页面中放置一个-Tag 就足够了web.xml(请参见下面的示例)。

否则,可能会有更好的方法来执行此操作,但这对我们有用:

我们使用servlet <filter>web.xml,捕捉所有的异常,并调用我们自定义的ErrorHandler,春节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模板应该几乎相同。当然,如果你的错误视图引发错误,那么你或多或少就会失去选择。

为了也捕获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);

}

以上是 在Spring MVC中渲染视图时如何处理抛出的异常? 的全部内容, 来源链接: utcz.com/qa/409950.html

回到顶部