読者です 読者をやめる 読者になる 読者になる

yohjizzz's Blog

I'm a Programmer.

Validator と Enum と僕。

「拡張Validatorのフィールド」と「Pageクラスでそれを指定するアノテーション」。
こいつらに Enum が存在すると HOT deploy のときのみ「IllegalPropertyRuntimeException(ESSR0059)」が発生する。

  • S2Container : 2.4.22
  • Teeda : 1.0.12

org.seasar.framework.beans.IllegalPropertyRuntimeException: [ESSR0059]クラス(hoge.app.validator.ExpressionValidator)のプロパティ(exprType)の設定に失敗しました。
理由はjava.lang.IllegalArgumentException: argument type mismatch
at org.seasar.framework.beans.impl.PropertyDescImpl.setValue(PropertyDescImpl.java:253)
at org.seasar.framework.beans.util.BeanUtil.copyProperties(BeanUtil.java:58)
at javax.faces.internal.HotDeployValidatorBuilderImpl.getSingleValidator(HotDeployValidatorBuilderImpl.java:58)
at javax.faces.internal.HotDeployValidatorBuilderImpl.build(HotDeployValidatorBuilderImpl.java:50)
at javax.faces.internal.ValidatorResource.getValidator(ValidatorResource.java:44)
at org.seasar.teeda.extension.validator.ValidatorLookupStrategyImpl.getStaticValidator(ValidatorLookupStrategyImpl.java:52)
at org.seasar.teeda.extension.validator.ValidatorLookupStrategyImpl.findValidator(ValidatorLookupStrategyImpl.java:43)
at javax.faces.component.UIInput.validateForExtension(UIInput.java:374)
    ・
    ・
    ・
Caused by: java.lang.IllegalArgumentException: argument type mismatch
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.seasar.framework.util.MethodUtil.invoke(MethodUtil.java:93)
at org.seasar.framework.beans.impl.PropertyDescImpl.setValue(PropertyDescImpl.java:248)

トレースを見る限り、BeanUtil を使ってアノテーションに指定された項目を Validator にバインドするところで「argument type mismatch」…
BeanUtil そのものはフィールドに Enum が存在しても(もちろん)動作するので、
バインドする為にアノテーションから抽出した Map に適切な Enum が格納されていないような気がする。
COOL deploy 時には再現しない(正常動作する)。


そもそも Teeda の不具合なのか、アプリ側の設定不備等によるものなのかの切り分けができてないので、
とりあえずこれから検証〜

追記

すみません。検証作業がだいぶ遅れてしまった…

んー,独自 Validator が SMART deploy 対象ならページクラスのアノテーションで使われる enum
Validator の enum もどっちも HotdeployClassLoader にロードされるはずで,この現象にはならないはずなんですが...
できれば, PropertyDescImpl#setValue() で IllegalPropertyRuntimeException をスローしているところにブレークポイントを付けて,
セットされる側とセットされる値のどっちが HotdeployClassLoader でロードされたクラスか確認してみてください.
たぶんセットされる側 (Validator のプロパティ) だと思いますが.

Validator と Enum と僕。 - ようじのにっき

Validator が SMART deploy 対象である(明示的な登録は行っていない)ことは確かです。
パッケージ構成は以下の通りです。

{app.root}.validator
 |
 +-- HogeValidator(Validator)
 |
 +-- Hoge(Annotation)
 |
 +-- HogeType(Enum)

ただ SMART deploy 対象のパッケージに Enum が存在してしまうことが原因なのは「ほぼ」間違いがないように思います。
クラスローダが異なるのも事実、
実際に無関係のパッケージに Enum と Annotation を移行すると HOT deploy でも当現象は再現されません。

さらに追記

> ただ SMART deploy 対象のパッケージに Enum が存在してしまうことが原因なのは「ほぼ」間違いがないように思います。
いや,それは原因ではないです.
本来なら Validator も HOT deploy 対象なので,Validator 側のプロパティの型も HOT deploy の enum になるべきなのです.
しかし,実際には Validator は HOT ではなく通常のクラスローダにロードされてしまっていると思われ,
その場合はプロパティの enum も同様に通常のクラスローダにロードされます.
そのため,HOT deploy でロードされたページクラス側の enumインスタンスを代入することができていないと思われます.
なので,そもそもの原因は Validator が HOT deploy のクラスローダにローされないこと,
解決策は Validator がちゃんと HOT deploy のクラスローダにロードされること,です.

Validator と Enum と僕。 - ようじのにっき

とんだ勘違いヤローでした。(id:koichikさん、何度もお手数をお掛けしました。)
Enum を含む Validator そのものが通常のクラスローダにロードされていたんですね…
とりあえず回避、ということであれば上述したように Enum を SMART deploy 対象から外す(パッケージ移行)で回避できますが、
これはバグ?という認識で良いのかな。
HOT deploy の仕組みそのものを理解していないからこーゆー状況に対処できない…
本質を理解する為のソースコードリーディングを先延ばしにしてしまった罰だ><

とりあえずソースコード読みつつ継続して検証してみることにする。

さらにさらに追記

SNAPSHOT をデプロイしたのでご確認ください.
http://maven.seasar.org/maven2-snapshot/org/seasar/teeda/teeda-core/1.0.13-rc5-SNAPSHOT/teeda-core-1.0.13-rc5-20080312.211229-2.jar
http://maven.seasar.org/maven2-snapshot/org/seasar/teeda/teeda-extension/1.0.13-rc5-SNAPSHOT/teeda-extension-1.0.13-rc5-20080312.211229-2.jar
http://maven.seasar.org/maven2-snapshot/org/seasar/teeda/teeda-ajax/1.0.13-rc5-SNAPSHOT/teeda-ajax-1.0.13-rc5-20080312.211229-2.jar
http: //maven.seasar.org/maven2-snapshot/org/seasar/teeda/teeda-tiger/1.0.13-rc5 -SNAPSHOT/teeda-tiger-1.0.13-rc5-20080312.211832-2.jar』(2008/03/13 06:30)

こちらからエントリーしておいて検証が遅くなりました。(申し訳ありません。m(_ _)m)
検証を行い、問題ありませんでした。御対応有難うございます。