【问题标题】:Struts 2 + Sitemesh 3 integration - NPE in FreemarkerDecoratorServletStruts 2 + Sitemesh 3 集成 - FreemarkerDecoratorServlet 中的 NPE
【发布时间】: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?

谢谢, 马立克

【问题讨论】:

标签: java struts2 integration freemarker sitemesh


【解决方案1】:

解决方法可能是将此 sn-p 放在Struts.xml 文件的末尾

<action name="pageNotFound">
    <result>404.jsp</result>
</action>

<action name="*">
    <result type="redirectAction">
        <param name="actionName">pageNotFound</param>
    </result>
</action>

它应该拦截每一个未声明的、请求的动作并将它们重定向到带有其 JSP 的现有动作。

试一试... ;)

【讨论】:

    猜你喜欢
    • 2013-09-29
    • 2013-07-13
    • 1970-01-01
    • 2013-01-24
    • 2013-10-05
    • 2010-11-18
    • 2017-02-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多