ログ日記

作業ログと日記とメモ

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+クリックで表示されたソースをコピペした。


それからApp.gwt.xmlの編集。

<source path="client" />
<source path="server/entity">
    <exclude name="*Names.java" />
</source>

<super-source path="super" />

これでserver/entityとプロジェクトルートのsuperがGWTコンパイル対象になる。*Names.javaseasarのPropertyNameを参照しているし使わないだろうから外しておく。
この辺の書き方は http://d.hatena.ne.jp/soundTrick/20110116/1295156155 ここを参考にした。


これで完成。テストでちょっと試しただけなので不都合があればまた書く。