1

struts2タイルプラグイン(v2.2.3)を使用していますが、ExecuteAndWaitInterceptorでI18nInterceptorを使用すると問題が発生します。基本的に、何らかの理由でexecAndWaitインターセプター(以下のxmlを参照)を追加すると、ローカリゼーションが機能しなくなり、ローカライズされたテキスト(TextProviderSupport.hasKeyなど)を取得しようとすると、NullPointerException(エラーを参照)が発生し、このコードに絞り込みました。 LocalizedTextUtil..。

public static String findText(Class aClass, String aTextName, Locale locale, String defaultMessage, Object[] args) {
    ValueStack valueStack = ActionContext.getContext().getValueStack();
    return findText(aClass, aTextName, locale, defaultMessage, args, valueStack);

}

...何らかの理由でgetValueStack()がnullであると想定していますが、その理由がわかりません。何か案は?

ありがとう、ライアン

<pre><code>    
    java.lang.NullPointerException
      at com.opensymphony.xwork2.util.LocalizedTextUtil.findText(LocalizedTextUtil.java:359)
      at com.opensymphony.xwork2.TextProviderSupport.hasKey(TextProviderSupport.java:98)
      at com.opensymphony.xwork2.ActionSupport.hasKey(ActionSupport.java:96)
      at com.test.plus.PlusSupport.getCurrentLocale(PlusSupport.java:213)
      at com.test.plus.import.Test.action.TestAction.testMethod(TestAction.java:801)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
      at java.lang.reflect.Method.invoke(Unknown Source)
      at com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:452)
      at com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:291)
      at org.apache.struts2.interceptor.BackgroundProcess$1.run(BackgroundProcess.java:57)
      at java.lang.Thread.run(Unknown Source)
</code></pre>

Struts.xml

<action name="Test/m/testMethod" method="testMethod" class="com.test.plus.import.Test.action.TestAction">
    <result type="tiles">/WEB-INF/jsp/import/Test/testMethod.jsp</result>
    <result name="success" type="tiles">/WEB-INF/jsp/import/Test/testMethod.jsp</result>
    <result name="input" type="tiles">/WEB-INF/jsp/import/Test/testMethod.jsp</result>
    <result name="error" type="tiles">/WEB-INF/jsp/import/Test/testMethod.jsp</result>
    <result name="wait" type="tiles">/WEB-INF/jsp/import/execAndWait.jsp</result>
    <interceptor-ref name="plusStack"/>
    <interceptor-ref name="defaultStack"/>
    <interceptor-ref name="execAndWait">
      <param name="excludeMethods">input,back,cancel</param>
    </interceptor-ref>
</action>
4

1 に答える 1

1

http://struts.apache.org/2.x/docs/execute-and-wait-interceptor.htmlから

重要:アクションは別のスレッドで実行されるため、ActionContextはThreadLocalであるため、使用できません。つまり、たとえばセッションデータにアクセスする必要がある場合は、ActionContext.getSession()を呼び出すのではなく、SessionAwareを実装する必要があります。

于 2012-10-03T10:14:10.240 に答える