- - PR -
XdocletのpushClassを使用したい
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 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で指定したクラスのメソッドが 取り出せなくなってしまうので意味がなくなってしまいます。 これらのせいでは無いのでは?と思うのですが、記述があると処理が 止まるので疑わざるをえません。 ご存知の方がいらっしゃいましたらご教示いただきたいです。 よろしくお願いします。 |
|
投稿日時: 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