[kvasir-user:159] PLUST+ で開発中に org.seasar.kvasir.base.dao プラグインの機能が使えますか
Nishioka Yuhei
[E-MAIL ADDRESS DELETED]
2007年 9月 27日 (木) 23:29:33 JST
お世話になっております。西岡です。
Kvasir で色々と開発を始めました。 面白くて最近はヤミツキです。
表題の件で質問させて下さい。
Kdiary Plugin を参考に sample というテーブルを作り、S2Dao を
通してデータの出し入れをしてみようとしました。
insert は通常通りにできるのですが、S2Dao でリストなどを取得しようと
すると以下のようなエラーが発生します。SQL などで直でアクセスすると
きちんとデータが入力できていることも確認できました。
ソースを追ったりして確かめてみたのですが、クラスローダに起因する
現象のようです。
何か私がミスっていそうなのですが、PLUST+ 開発中に S2Dao が
使えるかどうか、また、気をつけるべきとこなどを教えていただけますでしょうか。
[エラーメッセージ]
======================================
org.seasar.framework.beans.IllegalPropertyRuntimeException:
[ESSR0059]クラス(sample.sample.dao.Sample)のプロパティ(id)の設定に失敗しました。理由はjava.lang.IllegalArgumentException:
object is not an instance of declaring class
at org.seasar.framework.beans.impl.PropertyDescImpl.setValue(PropertyDescImpl.java:127)
Caused by: java.lang.IllegalArgumentException: object is not an
instance of declaring class
at java.lang.reflect.Method.invoke(Unknown Source)
at org.seasar.framework.util.MethodUtil.invoke(MethodUtil.java:49)
at org.seasar.framework.beans.impl.PropertyDescImpl.setValue(PropertyDescImpl.java:124)
at org.seasar.dao.impl.AbstractBeanMetaDataResultSetHandler.createRow(AbstractBeanMetaDataResultSetHandler.java:63)
at org.seasar.dao.impl.BeanListMetaDataResultSetHandler.handle(BeanListMetaDataResultSetHandler.java:50)
======================================
[状況]
(1) eclipse3.2 , jre1.6.0_02, tomcat6.0
sysdeo plugin デバッグモードで起動せず
の環境で Plust 0.0.4 を使って新規 Web アプリプラグインのひな形作成
(2) plugin.xml に以下を追加して、Sample クラス、SampleDao クラス作成
<extension point="org.seasar.kvasir.base.dao.persistentBeans">
<persistent-bean
class="sample.sample.dao.Sample" />
</extension>
<extension point="org.seasar.kvasir.page.ability.table.tables">
<table gard-id="sample.sample"
table-name="sample" />
</extension>
(3) Page クラスにおいて
- Sample オブジェクトを SampleDao を通して保存。
(4)
- SampleDao#selectAll をしようとした時に上記エラー発生
エラーとソースを追うことで BeanMetadata クラスで定義されている
beanClass からインスタンス化したオブジェクトが PropertyDesc#writeMethod で
定義されている beanClass のインスタンスになっていないようで
あることが分かる。
(5) 調査
DaoMetaDataFactory を Page クラスに注入して調査。
DaoMetaDataFactory#getMetaData#getBeanMetadata で
対象の BeanMetaData を取得。
中身を表示したところ
BeanMetadata の bean class とクラスローダ
sample.sample.dao.Sample$$EnhancedByS2AOP$$1f40b69=CACHED[org.seasar.kvasir.base.classloader.CompositeClassLoader]
そのスーパークラス
sample.sample.dao.Sample=O{
file:/C:/Users/nishioka/workspace3.2/sample/src/main/plugin/conf/,
file:/C:/Users/nishioka/workspace3.2/sample/build/classes/
}(parent=CACHED[org.seasar.kvasir.base.classloader.CompositeClassLoader])
bean class の class は Sample クラスを継承していることが分かる
BeanMetadata#getPropertyType(0)#getPropertDesc()#getReadMethod()#getDeclaringClass()
を表示すると以下のように Sampleクラスであるが、クラスローダが違うことが
分かる。
sample.sample.dao.Sample=[E-MAIL ADDRESS DELETED]
クラスローダが違うことによって、インスタンスとみなされず、
PropertyDesc#writeMethod がうまく動いていないようです。
以上です。
kvasir-user メーリングリストの案内