GWTとS2JDBCの連携
GWT + Seasar2 で困ったことが一つ。
S2JDBCのentityをGWTのクライアントに受け渡せない。
で、今まではDTOを作って詰め替えをしていたのだけれど…。
Slim3を少し触ってみたら、こっちはGWTに完全対応なのでDatastoreからのModel(S2JDBCでいうEntityのようなもの)の受け渡しがスムーズだ。
何故?と思ってソースを眺めてみると、Modelアノテーションを独自に作って、それもGWTのコンパイル対象になってるのね。なるほど、アノテーション自体がダメなわけではないのか。
http://code.google.com/webtoolkit/doc/latest/RefJreEmulation.html#Package_java_lang_annotation
というわけでS2JDBCのEntityもGWTクライアントで使えるようにトライ。
追記:すごく遠回りしたっぽい。
色々触っていて勘違いしていたが、どうやらアノテーションのソースは不要のようだ。
どうもgwt.xmlの書き方を間違えて、そこでエラーが出ていた模様。
<source path="client" /> <source path="server/entity"> <exclude name="*Names.java" /> </source>
これだけ書けばentityのクラスがGWTのクライアントでも使える。
source path を追加した場合はデフォルトのclientも書く必要があることと、パスの指定方法のスラッシュ区切りがドット区切りと間違えていたことが原因でエラーになってたっぽい。
Gearsも使っていてキャッシュが残っている可能性があるのでgit pullからやり直してみたが、たぶんこれで大丈夫。
ここから下は、もしGWTクライアント側でも何か処理が必要になった場合のためのメモということで。
追記終了
まずはjavax.annotation.*を持ってくる。
Debianならaptで入れる。
aptitude install sun-java6-source
dpkg -L sun-java6-source してみるとsrc.zipがあるので解凍。
javax/annotation/ 以下のファイルをプロジェクト直下のsuperディレクトリに移動。このとき javax/annotation/processing は不要。というか他のパッケージを参照しているので、あると動かない。
このやり方は超ソースの記事 http://d.hatena.ne.jp/bufferings/20100109/1263052743 を参考にした。
あとjavax.persistence.Entityアノテーションのソースも必要。geronimo-jpa_3.0_spec-1.0.jar にあるようだ。これはエンティティクラスのEntityアノテーションの上でCtrl+クリックで表示されたソースをコピペした。
<source path="client" /> <source path="server/entity"> <exclude name="*Names.java" /> </source> <super-source path="super" />
これでserver/entityとプロジェクトルートのsuperがGWTのコンパイル対象になる。*Names.java はseasarのPropertyNameを参照しているし使わないだろうから外しておく。
この辺の書き方は http://d.hatena.ne.jp/soundTrick/20110116/1295156155 ここを参考にした。
これで完成。テストでちょっと試しただけなので不都合があればまた書く。