Struts 2 (バージョン 2.3.14.3) を Sitemesh 3 (バージョン 3.0-alpha-2) と一緒に使用していますが、特定の状況で NullPointerException が発生します。
まず、web.xml からの struts2 / sitemesh 構成は次のとおりです。
<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>
さて、問題の説明は次のとおりです。
struts dev.mode が有効で、存在しないアクションにアクセスしようとすると、struts ConfigurationException がスローされます。
Struts ディスパッチャーは、org.apache.struts2.dispatcher.Dispatcher.sendError() を呼び出して例外を処理しようとします。これにより、標準の Struts エラー テンプレート (/org/apache/struts2/dispatcher/error.ftl) が応答に書き込まれます。
今、これは物事がうまくいかなくなる時です。
元のリクエストは sitemesh フィルターで装飾されていたため、構成エラーが発生した後でも、sitemesh はデコレーターを適用しようとしましたが、その結果、Struts アクション コンテキストが構成例外のために適切にセットアップされず、次の結果が得られたため、例外が発生しました。 :
java.lang.NullPointerException
org.apache.struts2.sitemesh.FreemarkerDecoratorServlet.process(FreemarkerDecoratorServlet.java:176)
FreemarkerDecoratorServlet.java からの適切なコードは次のとおりです。ctx 変数は null です。
ActionContext ctx = ServletActionContext.getActionContext(request);
model = freemarkerManager.buildTemplateModel(ctx.getValueStack(), ctx.getActionInvocation().getAction(), servletContext, request, response, wrapper);
アクションの呼び出し時にエラーが発生した場合に備えて、sitemesh は応答を装飾しようとするべきではないと思いますが、Struts2/Sitemesh 統合を変更せずにそれを行う方法がわかりません。
NPEを回避する方法はありますか?
ありがとう、マレク