• 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

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

  • 相关阅读:
    Autofac的基本使用---4、使用Config配置
    Autofac的基本使用---3、泛型类型
    Autofac的基本使用---2、普通类型
    Autofac的基本使用---1、前言
    MVC中Autofac的使用
    EF快速入门--直接修改(简要介绍ObjectContext处理机制)
    EF生成模型时Disigner中无信息
    C语言关键字-volatile
    linux内核分析之内存管理
    (转)Linux SLUB 分配器详解
  • 原文地址:https://www.cnblogs.com/alphablox/p/3386901.html
Copyright © 2020-2023  润新知