【发布时间】:2013-06-20 01:39:06
【问题描述】:
我正在使用 Struts 2(版本 2.3.14.3)和 Sitemesh 3(版本 3.0-alpha-2),在某些情况下我得到了 NullPointerException。
首先,这是我在 web.xml 中的 struts2 / sitemesh 配置:
<filter-mapping>
<filter-name>struts-prepare</filter-name>
<url-pattern>*.do</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
<filter-mapping>
<filter-name>sitemesh</filter-name>
<url-pattern>*.do</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
</filter-mapping>
<filter-mapping>
<filter-name>struts-execute</filter-name>
<url-pattern>*.do</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
<servlet>
<servlet-name>sitemesh-freemarker</servlet-name>
<servlet-class>org.apache.struts2.sitemesh.FreemarkerDecoratorServlet</servlet-class>
<init-param>
<param-name>default_encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
现在,这里是问题描述:
如果启用了 struts dev.mode,并且我尝试访问不存在的操作,则会引发 struts ConfigurationException。
Struts 调度程序尝试通过调用 org.apache.struts2.dispatcher.Dispatcher.sendError() 来处理异常,这会将标准 Struts 错误模板 (/org/apache/struts2/dispatcher/error.ftl) 写入响应.
现在事情开始出错了。
因为原来的请求是用sitemesh过滤器修饰的,即使在配置错误发生后,sitemesh也会尝试应用一个修饰器,这会导致异常,因为Struts动作上下文由于配置异常而没有正确设置,我是得到以下信息:
java.lang.NullPointerException
org.apache.struts2.sitemesh.FreemarkerDecoratorServlet.process(FreemarkerDecoratorServlet.java:176)
这是来自 FreemarkerDecoratorServlet.java 的相应代码 - ctx 变量为空:
ActionContext ctx = ServletActionContext.getActionContext(request);
model = freemarkerManager.buildTemplateModel(ctx.getValueStack(), ctx.getActionInvocation().getAction(), servletContext, request, response, wrapper);
我认为 sitemesh 不应该尝试装饰响应,以防在调用操作时出现错误,但我不知道如何在不修改 Struts2/Sitemesh 集成的情况下做到这一点。
任何想法如何避免 NPE?
谢谢, 马立克
【问题讨论】:
-
显示整个
web.xml文件。 -
为什么你的
struts-execute过滤器 url-pattern 是/struts/*?
标签: java struts2 integration freemarker sitemesh