2013-06-23 11 views
5

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

+1

Mostra l'intero file 'web.xml'. –

+0

eccolo qui: http://www.filedropper.com/web_1 –

+0

Perché il tuo url-pattern 'struts-execute' è'/struts/* '? –

risposta

1

Una soluzione potrebbe essere mettere questo frammento alla fine del file Struts.xml:

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

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

dovrebbe intercettare ogni non dichiarato, azione richiesta e reindirizzare un'azione esistente con il suo JSP.

Solo un tentativo ...;)

+0

Assistenza per il trasporto di liquidi da spiegare? –

Problemi correlati