- PR -

XdocletのpushClassを使用したい

1
投稿者投稿内容
take
大ベテラン
会議室デビュー日: 2004/08/13
投稿数: 177
お住まい・勤務地: 沖縄県北部
投稿日時: 2005-12-05 01:11
いつもお世話になります。j2sdk1.4.2_06、xdoclet1.2.2です。
Xdocletを使ってテンプレートからDAOクラスを作成しようと思ってるのですが、
妙なエラーが出てしまいます。WEBで検索してみてもなかなか
見つからず、質問させていただいております。(英語が苦手で・・・)

とりあえずxdocletファイルの一部です。
(javaのコード的にはおかしな部分が多いですが、要所だけを
残して削除してますので気にしないでください)


<XDtMethod:forAllMethods><XDtMethod:ifIsGetter><XDtMethod:ifHasMethodTag tagName="hibernate.many-to-one">

<XDtClass:pushClass value="<XDtMethod:methodType/>">

List list<XDtClass:className/> = sess.find("from <XDtClass:className/>");
<XDtClass:className/> value<XDtClass:className/>=null;
if(list<XDtClass:className/>.isEmpty()) {
value<XDtClass:className/>=new <XDtClass:className/>();

<XDtMethod:forAllMethods superclasses="true" sort="true">
//method=type:<XDtMethod:methodType/>,neme:<XDtMethod:methodName/>
</XDtMethod:forAllMethods>

}else {
for(Iterator iterator<XDtClass:className/>=list<XDtClass:className/>.iterator();iterator<XDtClass:className/>.hasNext();) {
value<XDtClass:className/>=(<XDtClass:className/>)iterator<XDtClass:className/>.next();
break;
}
}

</XDtClass:pushClass>

obj<XDtClass:className/>.<XDtMethod:setterMethod/>(value<XDtClass:className/>);
</XDtMethod:ifHasMethodTag></XDtMethod:ifIsGetter></XDtMethod:forAllMethods>



エラーは、
Invoking method failed: xdoclet.tagshandler.ClassTagsHandler.className
exception: null

が主な原因みたいです。
ちなみにこの状態で実行すると、対象となる最初のファイルが途中まで
作成されて、エラーの箇所でANTの処理が止まります。
</XDtClass:pushClass>でpushClassタグを閉じた後の最初の<XDtClass:className/>
たぐでエラーが発生します。クラス名はNULLですっていうことですよねー。

やってみたのが、
<XDtMethod:forAllMethods superclasses="true" sort="true">
//method=type:<XDtMethod:methodType/>,neme:<XDtMethod:methodName/>
</XDtMethod:forAllMethods>

を削除してみるととりあえずエラー無しでビルドはできます。
でもこれを削除してしまうとpushClassで指定したクラスのメソッドが
取り出せなくなってしまうので意味がなくなってしまいます。
これらのせいでは無いのでは?と思うのですが、記述があると処理が
止まるので疑わざるをえません。
ご存知の方がいらっしゃいましたらご教示いただきたいです。
よろしくお願いします。
take
大ベテラン
会議室デビュー日: 2004/08/13
投稿数: 177
お住まい・勤務地: 沖縄県北部
投稿日時: 2005-12-08 09:12
自己レスです。

forAllMethodsのループ内でpushClassを閉じた後に
classNameでクラス名を参照するとclassNameがNULL
になるみたいです。バグでしょうか?対応するため
classMatchValueを使用したらうまくいきました。


<XDtMethod:forAllMethods><XDtMethod:ifIsGetter><XDtMethod:ifHasMethodTag tagName="hibernate.many-to-one">
<XDtClass:setMatchValue value="<XDtClass:classOf><XDtMethod:methodType/></XDtClass:classOf>">
<XDtClass:pushClass value="<XDtMethod:methodType/>">

List list_<XDtClass:className/> = sess.find("from <XDtClass:className/>");
<XDtClass:fullClassName/> value_<XDtClass:className/>=null;
if(list_<XDtClass:className/>.isEmpty()) {
value_<XDtClass:className/>=new <XDtClass:fullClassName/>();

<XDtMethod:forAllMethods>
//method=type:<XDtMethod:methodType/>,neme:<XDtMethod:methodName/>
</XDtMethod:forAllMethods>

}else {
for(Iterator ite_<XDtClass:className/>=list_<XDtClass:className/>.iterator();ite_<XDtClass:className/>.hasNext();) {
value_<XDtClass:className/>=(<XDtClass:fullClassName/>)ite_<XDtClass:className/>.next();
break;
}
}

</XDtClass:pushClass>
obj_<XDtClass:matchValue/>.<XDtMethod:setterMethod/>(value_<XDtClass:matchValue/>);
</XDtClass:setMatchValue>
</XDtMethod:ifHasMethodTag></XDtMethod:ifIsGetter></XDtMethod:forAllMethods>


こんな感じです。ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)