[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 メーリングリストの案内