q36988 发表于 2015-8-10 10:16:48

Tomcat的error-page掩盖action实例化的exception

  在使用Struts2+Spring+Tomcat开发的时候,为了避免骚扰用户,线上系统我们一般会定义错误处理页面。但是如果开发环境中也这么做(在web.xml定义了错误转发页面),而碰巧某个action在实例化过程中出现了错误,那么错误消息会丢失,debug会很困难。因此建议开发环境中不要定义错误转发页面。
  自定错误转发页面如下所示:
  
  500
  /systembusy.vm
  
  我遇到的情况是,我的action中错误的引用了testng的logger,编译的时候没有问题,但是deploy的时候,testng.jar没有发布到web application中,导致action在实例化的时候,出现class not found的错误。为何编译的时候没有发现class 缺失呢,因为testng的scope是test,配置如下:
  
  org.testng
  testng
  6.1.1
  test
  
  在debug的过程中,我发现struts2处理请求的过程分成两部:请求分发,action实例化。
  请求分发的过程如下:

  实例化过程如下:

  可以看到struts2将实例化委托给Spring的bean factory完成实例化。如果实例化过程中出现exception,没有任何地方把log打印出来,只是会把错误发送到request的attributes里面,同时设置response的code为500.
  Standard wrapper valve是tomcat的pipeline中的门户,在讲response返回给用户之前,它会根据web.xml的配置显示错误消息。如果它发现error 500对应的是systembusy.html,则会显示该页面。如果没有发现该配置,则会显示默认的页面,如下图所示:

  虽然这个页面不能显示在线上,但是开发环境中这个信息还是弥足珍贵的。
页: [1]
查看完整版本: Tomcat的error-page掩盖action实例化的exception