我正在使用Struts 2(版本2.3.14.3)和Sitemesh 3(版本3.0-alpha-2),我在cerain情况下得到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变量为null:
ActionContext ctx = ServletActionContext.getActionContext(request);
model = freemarkerManager.buildTemplateModel(ctx.getValueStack(), ctx.getActionInvocation().getAction(), servletContext, request, response, wrapper);
我认为如果在调用操作时出现错误,sitemesh不应该尝试修饰响应,但我不知道如何在不修改Struts2 / Sitemesh集成的情况下执行此操作。
任何想法如何避免NPE?
谢谢, 马立克
答案 0 :(得分:1)
解决方法可能是将此代码段 放在Struts.xml
文件的末尾 :
<action name="pageNotFound">
<result>404.jsp</result>
</action>
<action name="*">
<result type="redirectAction">
<param name="actionName">pageNotFound</param>
</result>
</action>
它应该拦截每个未声明的,请求的操作,并使用其JSP将它们重定向到现有的Action。
试一试......;)