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
Pokaż cały plik 'web.xml'. –
o to tutaj: http://www.filedropper.com/web_1 –
Dlaczego wzorzec adresu URL filtra "struts-execute" to '/ struts/*'? –