2013-06-23 9 views
5

Używam Struts 2 (wersja 2.3.14.3) razem z Sitemesh 3 (wersja 3.0-alpha-2) i otrzymuję wyjątek NullPointerException pod pewnymi warunkami.Struts 2 + Integracja z serwletem 3 - NPE w FreemarkerDecoratorServlet

pierwsze, tutaj jest mój Struts2/sitemesh konfiguracja z 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> 

Teraz tutaj jest opis kwestia:

Jeśli rozpórki dev.mode jest włączone i próbuję uzyskać dostęp do akcja, która nie istnieje, generowany jest wyjątek ConfigurationException.

Dyspozytor Struts próbuje obsłużyć wyjątek, wywołując org.apache.struts2.dispatcher.Dispatcher.sendError(), który zapisuje standardowy szablon błędów Struts (/org/apache/struts2/dispatcher/error.ftl) do odpowiedź.

Teraz dzieje się tak, gdy wszystko idzie źle.

Ponieważ oryginalne żądanie zostało udekorowane filtrem sitemesh, nawet po wystąpieniu błędu konfiguracji, sitemesh próbuje zastosować dekorator, co powoduje wyjątek, ponieważ kontekst działania Struts nie jest poprawnie skonfigurowany ze względu na wyjątek konfiguracji i otrzymuję następujący:

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

Oto odpowiedni kod z FreemarkerDecoratorServlet.java - zmienna ctx jest zerowy:

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

myślę, że nie powinniśmy próbować sitemesh do dekoracji w odpowiedzi przypadku wystąpił błąd podczas wywoływania akcji, ale nie wiem jak to zrobić bez modyfikowania integracji Struts2/Sitemesh.

Wszelkie pomysły na uniknięcie NPE?

Dzięki, Marek

+1

Pokaż cały plik 'web.xml'. –

+0

o to tutaj: http://www.filedropper.com/web_1 –

+0

Dlaczego wzorzec adresu URL filtra "struts-execute" to '/ struts/*'? –

Odpowiedz

1

Rozwiązaniem mogłoby być wprowadzenie tego fragmentu na koniec pliku Struts.xml:

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

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

powinien przechwycić każdą nierejestrowanej, wymaganych działań i przekierować je do istniejąca Akcja wraz ze stroną JSP.

Po prostu spróbuj ...;)

+0

Obniżenie kosztów opieki w celu wyjaśnienia? –

Powiązane problemy