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

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

  • 相关阅读:
    2016.8.16上午纪中初中部NOIP普及组比赛
    Laravel之Eloquent ORM
    Laravel基础
    sql
    PHP面向对象编程
    PHP判断远程文件是否存在
    专业术语之------耦合?依赖?耦合和依赖的关系?耦合就是依赖
    门禁系统socket通讯编程
    PHP设计模式:类自动载入、PSR-0规范、链式操作、11种面向对象设计模式实现和使用、OOP的基本原则和自动加载配置
    PHP 真正多线程的使用
  • 原文地址:https://www.cnblogs.com/alphablox/p/3386901.html
Copyright © 2011-2022 走看看