[Seasar-user:20724] getComponent() で BeanWrapper が返ってくる (Re: HotDeployモードでIllegalArgumentException)

白井 薫 [E-MAIL ADDRESS DELETED]
2011年 4月 15日 (金) 14:56:12 JST


白井といいます。

いつもSeasarプロダクトの開発とサポートを続けて下さって 
いる皆様に
感謝をいたします。 m(__)m

さて、 SAStruts + S2Container (環境は末記記載)を 
利用して
Web開発をしている中での質問なのですが、
過去に投稿のあった、こちらと同じ問題に出くわしました:

[Seasar-user:16715] 【S2Struts】 HotDeployモードで 
IllegalArgumentExceptionが発生しています。
http://ml.seasar.org/archives/seasar-user/2009-January/016716.html


調べてみたところ、

@Component(instance = InstanceType.REQUEST)
class ComponentA implements Serializable {
   @Resource
   ComponentB componentB
}

@Component(instance = InstanceType.REQUEST)
class ComponentB implements Serializable {
}

このような2つの、同じタイプのコンポーネントがある状況で
  (これらはcreatorによって自動登録されています)

ComponentA.componentB に
ComponentB が自動バインディングされる際、
componentB フィールドに値をセットする Field.set メソッ 
ドにおいて、
値がフィールド型と互換性がないという  
IllegalArgumentException が発生します。

====

さらに調べてみると、
自動バインディングされるべき componentB を取得している
このような部分で、

     componentDef.getContainer().getComponent("componentB")

BeanWrapper (bean = componentB) クラスのオブジェクトが返って 
きます。

一方で、
getComponent("componentA") はそのまま ComponentA クラス 
のオブジェクトが
返ってきます。


この BeanWrapper が返ってきているというのが
おそらくこの IllegalArgumentException エラーの原因であ 
ろうと思うのですが、
  getComponent()がBeanWrapperを返してくる
というのはどのような原因が考えられますでしょうか?


【環境】

s2-frameworkのバージョンは2.4.43です。
s2-extensionのバージョンは2.4.43です。
s2-tigerのバージョンは2.4.43です。
sastruts 1.0.4sp7
Hot Deploy


よろしくお願いいたします。
--
白井 薫





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