zoukankan      html  css  js  c++  java
  • Tomcat的error-page掩盖action实例化的exception

    在使用Struts2+Spring+Tomcat开发的时候,为了避免骚扰用户,线上系统我们一般会定义错误处理页面。但是如果开发环境中也这么做(在web.xml定义了错误转发页面),而碰巧某个action在实例化过程中出现了错误,那么错误消息会丢失,debug会很困难。因此建议开发环境中不要定义错误转发页面。

    自定错误转发页面如下所示:

    <error-page>

           <error-code>500</error-code>

           <location>/systembusy.vm</location>

    </error-page>

    我遇到的情况是,我的action中错误的引用了testng的logger,编译的时候没有问题,但是deploy的时候,testng.jar没有发布到web application中,导致action在实例化的时候,出现class not found的错误。为何编译的时候没有发现class 缺失呢,因为testng的scope是test,配置如下:

    <dependency>

                         <groupId>org.testng</groupId>

                         <artifactId>testng</artifactId>

                         <version>6.1.1</version>

                         <scope>test</scope>

    </dependency>

    在debug的过程中,我发现struts2处理请求的过程分成两部:请求分发,action实例化。

    请求分发的过程如下:

    clip_image002

    实例化过程如下:

    clip_image004

    可以看到struts2将实例化委托给Spring的bean factory完成实例化。如果实例化过程中出现exception,没有任何地方把log打印出来,只是会把错误发送到request的attributes里面,同时设置response的code为500.

    Standard wrapper valve是tomcat的pipeline中的门户,在讲response返回给用户之前,它会根据web.xml的配置显示错误消息。如果它发现error 500对应的是systembusy.html,则会显示该页面。如果没有发现该配置,则会显示默认的页面,如下图所示:

    clip_image005

    虽然这个页面不能显示在线上,但是开发环境中这个信息还是弥足珍贵的。

  • 相关阅读:
    SharePoint 2010 新体验6 开发人员面板
    用JavaScript实现一个Timeline
    SharePoint 2010新体验2 – Ribbon界面
    SharePoint 2010 新体验5 Office Web Applications
    SharePoint 2010新体验1
    ES6 学习(1)
    ES6 学习(4) 字符串的扩展
    ES6学习(2)
    ES6 学习(5) 正则的扩展
    那些最近工作中遇到的插件
  • 原文地址:https://www.cnblogs.com/alphablox/p/3386901.html
Copyright © 2011-2022 走看看