[Seasar-user:17268] Re: [SAStruts]@Execute(removeActionForm=true) の場合の挙動

Tomoyuki KANO [E-MAIL ADDRESS DELETED]
2009年 4月 18日 (土) 10:59:31 JST


加納です

先に確認しておけば良かった X-(
>> POJOのActionFormをWrapしたActionFormWrapperは
>> リクエストに残っているので、revmoeActionForm=trueをやめて、
>>
>> セッションから、直接POJOのActionFormをremoveすればOKです。

駄目でした。
具体的には、セッションから ActionForm をremoveすると ActionFormWrapper
はリクエストに残っておりその actionForm フィールドも残っているのですが...

JSP にわたった時点で ActionForm のプロパティがリクエストスコープに
設定されません。そして、なぜかセッションに「初期化された」ActionForm
が置かれていました。

Action と ActionForm のプロパティを リクエストスコープに書き出すとこ
ろに問題があるのだろうと見当をつけて追いかけたところ、以下の問題を
見つけました。

S2RequestProcessor#exportPropertiesToRequest(...) {
  ...
  Object actionForm = actionMapping.getActionForm();
  ...
}

この getActionForm() ですと S2Container から取り出そうとしますが、
既にセッションから削除しているために、コンテナは新しいインスタンスを
生成し、セッションに登録して、返してきてしまいます。

ActionFormWrapper はリクエストスコープに存在しているはずなので、

  Object actionForm;
  ActionFormWrapper wrapper = (ActionFormWrapper) request
    .getAttribute(actionMapping.getAttribute());
  if (wrapper != null) {
    actionForm = wrapper.actionForm;
  } else {
    actionForm = actionMapping.getActionForm();
  }

とするのが正しいと思います。
trunk HEAD を修正して試してみたところ、期待通りに動作することを
確認しました。

ついでに、他に S2ActionMapping#getActionForm() を使っているところを
調べてみましたが、Executeメソッドの後処理に関わるところはここだけ
みたいですね。

修正をご検討ください。


Seasar-user メーリングリストの案内