2013-06-23 23 views
5

我使用Struts 2(2.3.14.3版本)與SiteMesh的3(3.0-α-2)和我在一起,我得到下cerain情況下一個NullPointerException。的Struts 2 + SiteMesh的3集成 - NPE在FreemarkerDecoratorServlet

首先,這裏是我的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> 

現在,這裏是問題描述:

如果支柱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?

感謝, 馬立克

+1

顯示整個'web.xml'文件。 –

+0

它在這裏:http://www.filedropper.com/web_1 –

+0

爲什麼你的'struts-execute'過濾器url-pattern是'/ struts/*'? –

回答

1

一種解決方法,可以把這個片段Struts.xml文件:

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

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

應該截獲每個未聲明的,請求的動作,並將其重定向到一個現有的Action與其JSP。

只是試試...;)

+0

Downvoter謹慎解釋? –