2009-06-28 11 views
21

Google Web Toolkitの学習を始め、Stock Watcherチュートリアルアプリケーションの作成を終了しました。GWT-RPCで持続JDOインスタンスを送信

は私の1はJDOを使用して(ストックのような)ビジネス・オブジェクトを持続し、RPCを介してクライアントへ/から前後ににそれを送信したい場合はその後、1、2つの別々のクラスを作成するために持っていることが正しい考えていますそのオブジェクトのため:JDOアノテーションはサーバ上に永続化するためのアノテーションと、RPC上でシリアライズ可能で使用される別のアノテーションを持つものですか?

私は証券ウォッチャーは別々のクラスを持って気づくと、なぜ私がtheoriseことができます。それ以外の場合はGWTコンパイラはすべて JDOとcom.google.blahのように参照する永続クラスのJavaScriptを生成する をしようと

  • を.users.Userなど
  • また、サーバー側の クラスには、クライアント に該当しないロジックがあり、その逆もあります。

私はこれを正しく理解していることを確認したいと思います。にする必要がない場合は、RPC で使用したいすべてのビジネスオブジェクトクラスの2つのバージョンを作成する必要はありません。

答えて

0

実際には別のインスタンスを作成する必要はありません。あなたのJDOオブジェクトは、とにかく普通のPOJOでなければならず、ビジネスロジックを含むべきではありません。それはあなたのビジネスレイヤーのためのものであり、永続的なオブジェクト自体のものではありません。

あなたがしなければならないことは、使用している注釈のソースを含めることだけです.GWTはクラスをコンパイルするだけです。また、GWTがコンパイルできないライブラリ(リフレクションを使用するものなど)を使用しないようにしたいのですが、これまで行ってきたすべてのプロジェクトで問題になることはありませんでした。

+1

には何の問題は、問題は、彼が彼のJDOsでビジネスロジックを持っているということではないではありません、それはだ... JSONを処理するために作り付けの機能を持っているすべてのオブジェクト

ためのケースではないかもしれません問題を引き起こしているJDOアノテーション(GWTがソースにアクセスできないため、あなたが指摘しているように)これはGWT + GAEの大きな問題であり、Googleが適切な解決策を明確に示してくれることを願っています。 –

2

あなたの評価は正しいです。 JDOは、オブジェクトグラフが変更されたときにスニッフィングするために、コレクションのインスタンスを独自の実装に置き換えます。これらの実装はGWTコンパイラには知られていないので、それらを直列化することはできません。これは、そうでなければGWT準拠型で構成されたクラスでは、JDOアノテーションで、特にオブジェクトプロパティのいくつかがコレクションである場合に、頻繁に発生します。詳細な説明と回避策については

、トピックにこのかなり影響力のあるエッセイをチェックアウト:http://timepedia.blogspot.com/2009/04/google-appengine-and-gwt-now-marriage.html

+2

JDOはコレクションを独自の実装で置き換えません。例えば、DataNucleusにはこれを行うオプションがありますが、デフォルトではjava.util。*クラスを使用するため、ユーザーにDataNucleusをクライアント側に置く必要はありません。 – DataNucleus

4

短い答えは:あなたが重複したクラスを作成する必要はありません。

私はあなたがGWT-貢献者リスト上の次のGoogleグループの議論から見てみることをお勧めします。ここでは

http://groups.google.com/group/google-web-toolkit-contributors/browse_thread/thread/3c768d8d33bfb1dc/5a38aa812c0ac52b

は興味深い抜粋です。

これはすべてのあなたの場合興味があります、私は は、GAEと GWT-RPCを一緒に " "ボックスの外で動作させる方法を説明しました。同じように、あなたのエンティティを宣言します。 @PersistenceCapable(たIdentityType = IdentityType.APPLICATION、取り外し可能な = "false" の)publicクラスMyPojoはSerializable {}

を実装し、すべてが動作しますが、手動で対処する必要が ます をクライアントからサーバに戻すときに再取り付けする場合は、

このオプションを使用すると、ミラー(DTO)クラスは必要ありません。 gilead(以前のhibernate4gwt)も試すことができます。これは、拡張されたオブジェクトのシリアライズの問題の中でいくつかの細部を処理します。

1

ドメインモデルの2つのバージョンを作成する必要はありません。

がStringエンコードされたキーではなく、AppEngineのKeyクラスを使用します。

は、ここでは、2つのヒントがあります。

pojo = pm.detachCopy(pojo) 

...すべてのJDO拡張機能が削除されます。

2

最終的に解決策が見つかりました。すべてであなたのオブジェクトを変更するが、上場のために、それはこの方法でくださいしないでください:

List<YourCustomObject> secureList=(List<YourCustomObject>)pm.newQuery(query).execute(); 
return new ArrayList<YourCustomObject>(secureList); 

実際の問題は、オブジェクトのシリアル化されていない...問題は、Googleが実装されているコレクションクラスをシリアル化することですシリアル化することはできません。

0

私は、GWTを通してオブジェクトを送信するためのより良いフォーマットは、JSONを使用することだと思います。この場合、サーバーからJSON文字列が送信され、クライアントで解析する必要があります。利点は、ブラウザでレンダリングされる最終的なJavascriptのサイズが小さくなることです。ページがより速く読み込まれるようになります。

第2に、オブジェクトをGWT経由で送信するには、オブジェクトをシリアル化する必要があります。これは、第三に、GWTはとてもクライアント側

+0

JSONを送信すると取引が簡素化されるのは間違いありませんが、クライアントとサーバーの両方で同じオブジェクトモデルを使用するGWTの優れた機能は除外されています。 –