2013-06-23 11 views
5

Ich benutze Struts 2 (Version 2.3.14.3) zusammen mit Sitemesh 3 (Version 3.0-Alpha-2) und bekomme unter Umständen eine NullPointerException.Struts 2 + Sitemesh 3 Integration - NPE in FreemarkerDecoratorServlet

Als erstes ist hier meine struts2/sitemesh Konfiguration von web.xml:

<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> 

Nun, hier ist die Frage Beschreibung:

Wenn Streben dev.mode aktiviert ist und ich versuche, ein Zugriff auf action, die nicht existiert, wird eine struts ConfigurationException geworfen.

Der Struts-Dispatcher versucht, die Ausnahme zu behandeln, indem er org.apache.struts2.dispatcher.Dispatcher.sendError() aufruft, der die Standard-Struts-Fehlervorlage (/org/apache/struts2/dispatcher/error.ftl) in die Antwort.

Jetzt ist hier, wenn die Dinge anfangen zu schief gehen.

Da die ursprüngliche Anfrage mit einem Sitemesh-Filter versehen wurde, versucht SiteMesh selbst nach dem Konfigurationsfehler einen Decorator anzuwenden, was zu einer Ausnahme führt, weil der Struts-Aktionskontext aufgrund der Konfigurationsausnahme und I nicht richtig eingerichtet wurde bin immer folgende:

java.lang.NullPointerException 
org.apache.struts2.sitemesh.FreemarkerDecoratorServlet.process(FreemarkerDecoratorServlet.java:176) 

Hier ist der entsprechende Code aus FreemarkerDecoratorServlet.java - ctx Variable ist null:

ActionContext ctx = ServletActionContext.getActionContext(request); 
model = freemarkerManager.buildTemplateModel(ctx.getValueStack(), ctx.getActionInvocation().getAction(), servletContext, request, response, wrapper); 

ich denke, dass sitemesh nicht die Antwort dekorieren sollte versuchen, in Falls beim Aufruf der Aktion ein Fehler auftritt, weiß ich nicht, wie ich das tun soll, ohne die Struts2/Sitemesh-Integration zu ändern.

Irgendwelche Ideen, wie man die NPE vermeidet?

Danke, Marek

+1

zeigen die ganze 'web.xml' Datei. –

+0

hier ist es: http://www.filedropper.com/web_1 –

+0

Warum ist Ihr 'struts-execute' Filter URL-Muster'/struts/* '? –

Antwort

1

Eine Abhilfe dieses Snippet am Ende könnte der Struts.xml Datei setzen:

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

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

es jede nicht angemeldete, angeforderte Aktion abfangen soll, und leitet sie an eine bestehende Aktion mit ihrer JSP.

ein Versuch mal ...;)

+0

Downvoter Pflege zu erklären? –