java - Spring MVC 通用异常处理

标签 java maven spring-mvc

我正在使用以下通用类来处理我的应用程序中的所有类型的异常。它处理大多数异常,但无法处理某些异常,例如“org.apache.tiles.impl.CannotRenderException”。我怎样才能让它捕获所有类型的异常?

我使用的一些技术是:Spring 4.0.0.RELEASE、Tiles 2.2、Maven 1.6、Spring Webflow 2.4.0.RELEAS

@ControllerAdvice
class GenericDefaultExceptionHandler {
    public static final String DEFAULT_ERROR_VIEW = "error/error";
    private static final String DEFAULT_ERROR_SUBJECT = "Exception occurred";
    final Logger logger = LoggerFactory.getLogger(getClass());

    @Autowired
    private MailService mailService;

    @ExceptionHandler(value = Exception.class)
    public ModelAndView defaultErrorHandler(HttpServletRequest req, Exception e) throws Exception {
        if (AnnotationUtils.findAnnotation(e.getClass(), ResponseStatus.class) != null)
            throw e;
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", e);
        mav.addObject("url", req.getRequestURL());
        mav.setViewName(DEFAULT_ERROR_VIEW);
        //send email to system admin
        sendMessageToAdmin(e.toString(),req.getRequestURL().toString());
        logger.error(e.toString());
        return mav;
    }

    private void sendMessageToAdmin(String exceptionAsMessage, String url) {
        try {
            StringBuilder errorMessage = new StringBuilder();
            errorMessage.append("Exception on request URL :");
            errorMessage.append(url);
            errorMessage.append("\n\n");
            errorMessage.append("The Exception was: ");
            errorMessage.append(exceptionAsMessage);
            mailService.sendMailWithSubject(DEFAULT_ERROR_SUBJECT,errorMessage.toString());
        } catch (Exception e) {

        }
    }
}

谢谢

最佳答案

问题是您的处理程序捕获了 Controller 中的异常,但在 Controller 完成其工作后,在 View 中抛出了平铺异常。您可以尝试使用过滤器来处理它们:

public void doFilter(ServletRequest request, ServletResponse response,
        FilterChain chain) throws IOException, ServletException {
    ...
    try {
        chain.doFilter(request, response);
    }
    catch (Exception ex) {
        // your stuff
        ...
        throw new ServletException(ex);
    }
}

独立于此(或另外),您还可以要求容器在发现异常时或当 Controller 使用 sendError 以及 web.xml 中的某些配置时使用某些 View 文件:

<!-- error-code related error pages -->
<error-page>
    <error-code>404</error-code>
    <location>/ErrorHandler</location>
</error-page>
<error-page>
    <error-code>403</error-code>
    <location>/ErrorHandler</location>
</error-page>

<!-- exception-type related error pages -->
<error-page>
    <exception-type>
          javax.servlet.ServletException
    </exception-type >
    <location>/ErrorHandler</location>
</error-page>

<error-page>
    <exception-type>java.io.IOException</exception-type >
    <location>/ErrorHandler</location>
</error-page>

关于java - Spring MVC 通用异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26108271/

相关文章:

java - Hibernate char 列枚举

java - JBOSS AS 7 和 com.mysql.jdbc.Driver 错误

maven - 尝试使用 Maven Surefire 在不同的 JVM 上运行 JUNIT 测试

java - Spring @ExceptionHandler 返回 HTTP 406

java - Spring 3.1.1 web MVC - 限制对接口(interface) getter 的响应

java - 流中的分配(java)

java - 停止在 Eclipse 重新启动时打开 Viewparts 窗口

performance - Maven中有 "skip weaving flag"吗? (不包括 AspectJ)

java - 编译阶段后通过 Maven 插件生成新源

java - 将 CookieParam 注释与 Spring MVC Controller 一起使用