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