5

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を回避する方法はありますか?

ありがとう、マレク

4

1 に答える 1

1

A workaround could be putting this snippet at the end of the Struts.xml file:

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

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

it should intercept every undeclared, requested action and redirect them to an existing Action with its JSP.

Just a try... ;)

于 2013-07-01T13:04:59.343 に答える