2009-04-14 20 views
17

GWTとGAEを使用してデータの永続性を必要とするWebアプリケーションを開発したいと考えています。私が理解しているように、データ永続性のための私の唯一の(あるいは少なくとも最も便利な)オプションは、JDOまたはJPA注釈付きオブジェクトを使用するGAEのDatastoreです。また、GWTリモートプロシージャコール(RPC)を使用してオブジェクトを前後に送信できるようにするため、オブジェクトが「分離」できる必要があります。しかし、GWT RPCのシリアル化は分離されたJDO/JPAオブジェクトを扱うことができず、まもなく登場するようには見えません。Google Web Toolkit(GWT)+ Google App Engine(GAE)+デタッチデータの永続性

私の質問:これに対する最も簡単で最も直接的な解決策は何ですか?同じオブジェクトのクライアント/サーバーをサーバー側の永続性で共有できることは非常に便利です。私はまだGAEのデータストアとGWTのRPCを使用したいことを明確にすべき

EDIT

。私は、これらのテクノロジーがすべて一緒に働くことを可能にする最良のソリューションを探しています。

+0

+1ローカルデータの永続化のためのクラスタリングWebベースのサービスを使用しています。 :-) –

+1

ここで回答を得た後、あなたの進捗状況を共有することを検討しますか? (そして最良の答えを選択することを検討してください) –

答えて

0

最終的にGWTはJavaScriptにコンパイルされるので、分離された永続性のためには利用可能なサービスの1つが必要です。最もよく知られているのはHTML5ストアとGears(両方ともSQLiteを使用しています)です。どちらも広く展開されていないため、ユーザーに最新のブラウザを使用させるか、あまり知られていないプラグインをインストールするようにユーザーを説得する必要があります。ユーザーが

+0

デタッチすることによって、彼らはブラウザでの永続性がなく、休止状態などの強化されたdtosの送信について話しています。 –

+0

用語衝突の典型的なケース。 – Javier

3

を遵守していない場合は、使用可能なサブセットに劣化してくださいホワイル前、私はUsing an ORM or plain SQL?

記事を書いたこれは私が書いていたGWT アプリケーションで昨年思い付きました。 をEclipseLinkから へのサービス 実装のプレゼンテーションオブジェクトに変換します。 ibatisを使用していた場合は、 に適切なオブジェクトを作成し、 ibatisで作成してから、すべての方法で を上下に渡してください。一部の純粋主義者 はこれがBad™であると主張するかもしれません。たぶんそうだ( 理論)しかし、私はあなたに何を言う:それは 簡単なコードにつながっていた、 より簡単なスタックと生産性。

基本的にあなたの観察と一致します。

もちろん、Google App Engineのオプションではないので、クライアント側のオブジェクトとJPAエンティティの間に翻訳レイヤーを置いています。

JPAエンティティは非常に堅牢であるため、クライアントとの間でやりとりするのには本当に適切ではありません。通常、これを実行するときにいくつかのエンティティからのビットをほんの少しだけ必要とします(つまり、何らかのプレゼンテーションレイヤの値オブジェクトで終わる)。それがあなたの道です。

2

JSONの使用を検討することができます。 GWTには、&を解析するために必要なAPIがあり、クライアント側でJSON文字列を生成します。あなたはサーバー側のJSON APIをたくさん入手します。私はgoogle-gsonで試しましたが、これは問題ありません。あなたのJSON文字列をPOJOモデルとその逆に変換します。これはあなたがあなたの条件http://gilead.sourceforge.net/

7

てみ使用のためにまともなソリューションを提供するのに役立ちます願っています。私はそれを試して、それは動作します。

GWTはDataNucleusで使用される隠しオブジェクト[]をシリアル化できないため、分離可能エンティティの代わりにTransientを使用する必要があります。つまり、クライアントに送信するオブジェクトをデータストアに戻すことはできません。実際のデータストアオブジェクトを取得し、すべての永続フィールドをコピーして戻す必要があります。 Rayのメソッドはリフレクションを使用してメソッドを反復し、getBean()メソッドとsetBean()メソッドを取得し、一時的なgwtオブジェクトのgetBean()でエンティティsetBean()を適用します。

JPDはJDOを使用するように努めなければなりません.JPAは今のところラッパークラスに過ぎません。このハックを使用するには、すべての "bean"フィールドに対してPROPER getBeanおよびsetBean構文を使用して、すべての永続フィールドに対してgetterメソッドとsetterメソッドの両方を持たなければなりません。まあ、ALMOST PROPERは、デフォルトのブール値フィールドの使用が "is"のとき、すべてのgetterが "get"で始まると仮定しているためです。

私はこの問題を修正し、Rayのブログにコメントを投稿しましたが、承認待ちの状態で、投稿するかどうかはわかりません。基本的には、@ GetterPrefix(prefix = MethodPrefix.IS)アノテーションをorg.datanucleusパッケージに実装して作業を強化しました。

投稿されておらず、これが問題である場合は、x_AT_aiyx_DOT_infoにメールを送ってください。Re:@GetterPrefix for JDOと私はあなたに修正をお送りします。

+0

もっと具体的にはAdapter4AppEngine http://noon.gilead.free.fr/gilead/index.php?page=adapter4appengine GoogleのJDOタイプのすべてがシリアル化されるわけではないことにご注意ください。 Text、Blob、Userなどがあります。あなたはまだこれを別の方法で回避する必要があります。 – Drew

3

Try this。これは、GAEコアタイプをシリアライズし、それらをGWTクライアントに送信するためのモジュールです。

2

現在、私はDTO(DataTransferObject)パターンを使用しています。必ずしもクリーンで豊富な定型文ではありませんが、GAEは依然としてかなりの量の定型文を必要とします。 ;)

私はドメインオブジェクトを(通常は)DTOと1対1で対応付けています。クライアントがドメイン情報を必要とするとき、DAO(DataAccessObject)はDomainオブジェクトのDTO表現を咳打ちし、それを電信線を介して送信します。 DTOが戻ってくると、私はDAOにDTOを渡し、次にそれが適切なすべてのドメインオブジェクトを更新します。

ドメインオブジェクトを電線の向こう側に直接渡すことはできませんが、GAEのJDO実装とGWTのシリアライゼーションプロセスの制限は、これが私がこれを現在処理する最もクリーンな方法であることを意味します。

0

Datastore APIを使用してPOJOドメインオブジェクトをロード/ストアするのはどうですか?

DTOアプローチに匹敵するはずです。リフレクションベースの自動化のようなトリックを使用しない場合はすべてのフィールドを手動で処理する必要がありますが、すべてのデータストア機能に柔軟性と完全なアクセスを提供する必要があります。

5

私は最近、Objectifyを見つけました。これはJDOの代替品として設計されています。それほど多くの経験はまだありませんが、JDOよりも使い易いですが、軽量で、GWTのDTOの必要性を取り除くと主張しています。

1

私はObjectifyも使用していて、本当に好きです。 pre/postLoadメソッドを使っていくつかのダンスをやって、翻訳する必要があります。テキストを文字列に変換して戻す。

2

Googleの正式な回答は、GWT 2.1 RequestFactoryです。 GWTとGAEを使用しているとすれば、公式のGoogleフレームワークに固執することをお勧めします...私はGWT/GAEベースの同様のアプリを持っています。

ちなみに、RequestFactoryを設定するのはお尻の痛みです。現在のEclipseプラグインにはすべてのjarファイルが含まれていませんが、必要なヘルプはStackoverflowで見つかりました