Sto usando Struts 2 (versione 2.3.14.3) insieme a Sitemesh 3 (versione 3.0-alpha-2) e sto ricevendo una NullPointerException in circostanze diverse.Integrazione Struts 2 + Sitemesh 3 - NPE in FreemarkerDecoratorServlet
In primo luogo, ecco la mia Struts2/configurazione SiteMesh da 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>
Ora, qui è la descrizione del problema:
Se puntoni dev.mode è abilitato e cerco di accedere a un azione che non esiste, viene generata una struttural ConfigurationException.
Il dispatcher di struts tenta di gestire l'eccezione chiamando org.apache.struts2.dispatcher.Dispatcher.sendError(), che scrive il modello di errore standard di Struts (/org/apache/struts2/dispatcher/error.ftl) in risposta.
Ora questo è quando le cose iniziano a andare storte.
Poiché la richiesta originale è stata decorata con filtro sitemesh, anche dopo che si è verificato l'errore di configurazione, sitemesh tenta di applicare un decoratore, il che si traduce in un'eccezione, poiché il contesto dell'azione Struts non è configurato correttamente a causa dell'eccezione di configurazione e sto ottenendo il seguente:
java.lang.NullPointerException
org.apache.struts2.sitemesh.FreemarkerDecoratorServlet.process(FreemarkerDecoratorServlet.java:176)
Ecco il codice appropriato da FreemarkerDecoratorServlet.java - variabile CTX è nullo:
ActionContext ctx = ServletActionContext.getActionContext(request);
model = freemarkerManager.buildTemplateModel(ctx.getValueStack(), ctx.getActionInvocation().getAction(), servletContext, request, response, wrapper);
penso che SiteMesh non dovrebbe provare a decorare la risposta in caso c'è un errore durante il richiamo dell'azione, ma non so come farlo senza modificare l'integrazione Struts2/Sitemesh.
Qualche idea su come evitare l'NPE?
Grazie, Marek
Mostra l'intero file 'web.xml'. –
eccolo qui: http://www.filedropper.com/web_1 –
Perché il tuo url-pattern 'struts-execute' è'/struts/* '? –