21

私はちょうど Google Web Toolkit の学習を開始し、Stock Watcher チュートリアル アプリの作成を完了しました。

JDO を使用してビジネス オブジェクト(Stock など)を保持し、RPC を介してクライアントとの間で送受信する場合、そのオブジェクトに対して 2 つの別個のクラスを作成する必要があるという私の考えは正しいです。サーバーと、シリアル化可能でRPC経由で使用される別のサーバーで永続化するには?

Stock Watcher には個別のクラスがあることに気付き、その理由を理論化できます。

  • そうしないと、gwt コンパイラは、JDO や com.google.blah.users.User など、永続化されたクラスが参照するすべてのものに対して JavaScript を生成しようとします。
  • また、サーバー側のクラスには、クライアントには適用されないロジックがあり、その逆もあります。

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

4

6 に答える 6

4

簡単に言うと、重複するクラスを作成する必要はありません

gwt-contributors リストにある次の Google グループのディスカッションを参照することをお勧めします。

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

ここに興味深い抜粋があります:

これだけに興味がある場合は、GAE と GWT-RPC を「箱から出して」連携させる方法を説明しました。エンティティを次のように宣言するだけです: @PersistenceCapable(identityType = IdentityType.APPLICATION, detachable = "false") public class MyPojo implements Serializable { }

すべてが機能しますが、オブジェクトをクライアントからサーバーに送り返すときに、手動で再接続を処理する必要があります。

このオプションを使用でき、ミラー (DTO) クラスは必要ありません。gilead (以前の hibernate4gwt) を試すこともできます。これは、拡張オブジェクトをシリアル化する際の問題の詳細を処理します。

于 2009-09-29T13:31:36.507 に答える
2

あなたの評価は正しいです。JDO は、コレクションのインスタンスを独自の実装に置き換えます。これは、オブジェクト グラフが変更されたときにスニッフィングするためだと思います。これらの実装は GWT コンパイラーには認識されないため、シリアライズできません。これは、他の点では GWT 準拠の型で構成されているが、JDO アノテーションを使用するクラスでよく発生します。特に、一部のオブジェクト プロパティがコレクションである場合に発生します。

詳細な説明と回避策については、このトピックに関する非常に影響力のあるエッセイをご覧ください: http://timepedia.blogspot.com/2009/04/google-appengine-and-gwt-now-marriage.html

于 2009-06-30T05:43:14.257 に答える
2

私は最終的に解決策を見つけました。オブジェクトをまったく変更しないでください。ただし、リストの場合は次のようにします。

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

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

于 2011-01-28T09:46:59.340 に答える
1

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

以下に 2 つのヒントを示します。

Appengine Key クラスではなく、文字列でエンコードされたキーを使用します。

pojo = pm.detachCopy(pojo)

...すべての JDO 拡張機能を削除します。

于 2010-05-06T23:50:11.703 に答える
0

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

次に、GWTを介してオブジェクトを送信するには、オブジェクトをシリアル化できる必要があります。これは、すべてのオブジェクトに当てはまるとは限りません。

第三に、GWTにはJSONを処理する関数が組み込まれているため、クライアント側で問題は発生しません。

于 2013-01-25T12:23:55.710 に答える
0

個別のインスタンスを作成する必要はまったくありません。実際、作成しないほうがよいでしょう。いずれにせよ、JDO オブジェクトは単純な POJO である必要があり、ビジネス ロジックを含めることはできません。これは、永続オブジェクト自体ではなく、ビジネス層のためのものです。

使用しているアノテーションのソースを含めるだけで、GWT はクラスを正常にコンパイルするはずです。また、GWT がコンパイルできないライブラリ (リフレクションを使用するものなど) の使用を避けたいと考えていますが、私が行ったすべてのプロジェクトでこれが問題になったことはありません。

于 2009-06-29T22:16:54.570 に答える