系统使用freemarker做为页面展现层,为了解决系通通一异常的问题。因而配置了struts2的统一异常解决办法(这个网上资料不少,你们能够查看),但是发现freemarker出现异常后,struts2的全局异常处理仍然捕捉不到这个异常。分析源码以后发现struts2的FreemarkerResult在解析FTL文件的时候根据Configuration的属性去判断其属性TemplateExceptionHandler是否为"RETHROW_HANDLER",也就是说是否抛出这个异常,若是抛出则因为FremarkerResult的这些代码是由struts2操做的(你们能够看源码,其实上最终是由DefaultActionInvocation的executeResult来调用的,这个类是贯穿拦截器、action、result的一个核心调动类,具体的这里咱们不作讨论),因此若是一旦Freemarker抛出异常,则这个异常会被struts2的全局异常处理来解决,不然就会由freemarker本身解决,就会报那种黄色的很恶心的页面。FreemarkerResult代码截图以下:session
其中上边被选中的蓝色部分就是让freemarker本身来处理这个异常,这样struts2就捕捉不到了。那么,默认状况下struts设置的是HTML_DEBUG_HANDLER的,你们能够在TemplateExceptionHandler这个接口的成员变量定义中看到这个静态属性的具体实现代码,顾名思义或者你们去看这个代码,实际上这种方式就是输出咱们平时看到的FTL报空指针等时输出的那堆很恶心的东西,这个struts2是捕捉不到这个异常的。设计
问题找到了,解决思路就很简单了,如今有两种方法:指针
1)在freemarker.properties中设置:template_exception_handler=rethrow,这个rethrow也是在TemplateExceptionHandler接口中定义的;
2)想办法设置freemarker的Configuration中该变量,好比咱们项目中我扩展了struts2的FreemarkerManger,而后在其中设置了这个属性。接口
好了,以上的问题就说完了,这样处理后struts的全局异常问题就能解决了。那么万一你使用了sitemesh,并且你在装饰模板的FTL文件中使用了session的属性,一样万一你的session被清空后,也会报一堆黄色的东西,这个struts2也不会捕捉到,这是由于当sitemesh执行本身的逻辑时,strust2的逻辑已经执行完毕,因此再抛什么异常struts2是没法获取到的,那么到底该怎么处理呢?咱们会在另外一个博文中对sitemesh的源码和设计思路进行分析,而后来解决这个问题。rem
版权声明:本文为博主原创文章,未经博主容许不得转载。源码