kuniku’s diary

はてなダイアリーから移行(旧 d.hatena.ne.jp/kuniku/)、表示がおかしな箇所はコメントをお願いします。記載されている内容は日付およびバージョンに注意してください。直近1年以上前は古い情報の可能性が高くなります。

S2Strutsで、異なるActionのForm(POJOForm)はDIされない?

S2Struts
使用しているバージョン、一部抜粋
s2-struts-1.2.12.jar、s2-struts-tiger-1.2.12.jar、s2-framework-2.3.23.jar、s2-extension-2.3.23.jar

struts-config.xml

<form-beans>
   <form-bean name="aDto" type="xxx.ADto" />
   <form-bean name="bDto" type="xxx.BDto" />
</form-beans>
<action-mappings>
   <action path="/Aaction" 
      name="aDto"
      type="xxxAction"
      scope="session"
      validate="false">
      <forward name="ok" path="A.jsp" />
   </action>
   <action path="/Baction"
      name="bDto"
      type="xxxBction"
      scope="session"
      validate="true">
      <forward name="ok" path="B.jsp" />
   </action>
</action-mappings>

のように定義したような場合に、(POJOFormを使っていてscopeは、セッションで扱っています。)

/Aactionには
aDtoのセッターを用意しておくと、aDtoがPOJOFormとしてインジェクションされます。

/Bactionには
bDtoのセッターを用意しておくと、bDtoがPOJOFormとしてインジェクションされます。

このときに、/Batcionの時に、aDtoのセッターを用意しているけどインジェクション
されないのですが、これはActionに対するFormが異なるからでしょうか?
(何かが悪くてインジェクションされないのかな?)

/Bactionが実行された際に、セッションに登録されたオブジェクトを見ると、
aDtoがaDtoというkeyでセッションにあり

aDto=org.seasar.struts.interceptors.ProcessPojoFormInterceptor$SerializeBeanValidatorForm@36eb76}

として保持されています。
そのSerializeBeanValidatorFormのbeanに、aDtoのインスタンスがあります。

http://ml.seasar.org/archives/seasar-user/2007-November/011503.html
http://javadoc.n2hiroba.com/seasar.org/s2struts/1.2.12/org/seasar/struts/interceptors/ProcessPojoFormInterceptor.SerializeBeanValidatorForm.html
https://www.seasar.org/issues/browse/STRUTS-6
https://www.seasar.org/issues/browse/STRUTS-23

上記あたりを見て、
SerializeBeanValidatorFormのgetInstance() により、bDtoの型にキャストすれば
取り出せることはわかったのですが、bDtoは、どうやって取得すべきなのでしょうか?

aDtoを、diconで、セッション扱いにしないといけないのか?そうすればDIされるのか?
別のやり方法があるのか?

2008-12-06追記
セッターを記述する際に、JAVABeansの規約に基づいて書くこと。
そうすれば、異なるActionのDto

private XyyyyyyyyDto xyyyyyyyyDto;

public void setXyyyyyyyyDto(XyyyyyyyyDto  xyyyyyyyyDto){
  this.xyyyyyyyyDto = xyyyyyyyyDto;
}

は、よいけど、↓のように書いちゃよくない

private XyyyyyyyyDto xyyyDto;

public void setXyyyDto(XyyyDto  xyyyyDto){
  this.xyyyDto= xyyyyDto;
}