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
zeigen die ganze 'web.xml' Datei. –
hier ist es: http://www.filedropper.com/web_1 –
Warum ist Ihr 'struts-execute' Filter URL-Muster'/struts/* '? –