2

サーバーからクライアントに文字列を送信するために GWT Atmosphere を使用していますが、これは非常にうまく機能します。

ただし、GWT RequestFactory によってシリアル化されたエンティティ全体をサーバーからクライアントに送信したいと考えています。お客様からのご依頼は一切不要!

そこでSimpleRequestProcessor#createOobMessage(domainObject)、そのペイロードを操作してクライアントに送信しようとしました。ペイロードの計算は機能します。

次に、を使用してそのメッセージをデコードし、の呼び出しリストから正しいものとしてAutoBeanCodex#decode読み取ります-ただし、その場合、続行するには何らかの設定が必要です(260行目あたり:)domainObjectEntityProxyResponseMessageserverIdAbstractRequestFactory#getIdassert serverId != null : "serverId"

クライアントからリクエストを送信せずにプロキシ ペイロードをデコードする方法について何かアドバイスはありますか?

アップデート

この質問のユースケースは、チャットのようなコミュニケーションです。クライアントはサーバーからのメッセージを要求しませんが、代わりに新しいメッセージが通知されます。そして、メッセージとメッセージの送信者に関する情報を通知ペイロードに含めたいと思います。とにかくプロジェクトで RequestFactory を使用しているので、すべてのプロキシ ワイヤリングを設定したことを利用して、関連するオブジェクト グラフをクライアントにプッシュするだけです。

4

1 に答える 1

1

RF メッセージをシリアライズしてエンティティとして送信しようとしているのはなぜですか? RequestFactory は、ネットワーク上でデータを送信するだけの方法ではありません。クライアントからサーバーに送信できる少なくとも 3 種類のメッセージ (インスタンスの作成、setter の呼び出し、およびサービス メソッドの呼び出し) があります。サーバーで何が起こったかに基づいて、データをクライアントに返すことができるだけでなく、どのような変更が行われたか、およびそれらのセッターが JSR303 ルールの下で無効な変更を行ったかどうかについてのメッセージが返されます。

エンティティを記述、送信、および受信するための、より単純なインターフェイスの方法を試していますか? それとも、実際にクライアントとサーバーの両方で RF ワイヤリングを行い、リクエストをバッチ処理し、EntityProxyId インスタンスを参照し、クライアントが差分のみを送信できるようにする必要がありますか?

単純なオブジェクト宣言だけが必要な場合は、既に見たAutoBeans とを使用してみAutoBeadCodexてください。クライアントとサーバーの両方でインスタンスを簡単に作成およびマーシャリングし、大気のトランスポートを介してそれらを文字列として渡すことができます。

実際には RequestFactory が必要であるが、AJAX 以外で実行している場合は、他のオプションがあります。Atmosphere を介して文字列を送受信するのではなく (これは RPC 呼び出しのプッシュ サポートを提供することを目的としていると思われます)、その基礎となるプッシュ レイヤーを使用して、RequestFactory に新しいリクエスト トランスポートを実装することを検討してください。

com.google.web.bindery.requestfactory.shared.RequestTransportcom.google.web.bindery.requestfactory.gwt.client.DefaultRequestTransport任意の通信メカニズムを使用するために実装できます (デフォルトの AJAX バージョンを参照)。サーバーを構築するcom.google.web.bindery.requestfactory.server.RequestFactoryServletには、Locator、ServiceLocators などを介してメッセージをプッシュするために実際に何をする必要があるかを調べてください。

本当に Atmosphere と RF を使用したい場合はRequestTransport、単純な Atmosphere インターフェイスをラップしてサーバーを呼び出す を構築することを検討してください。文字列メッセージを呼び出しに変換します (ここでも、RequestFactoryServlet がそれを行う方法を参照してください)。

于 2012-01-10T01:12:30.817 に答える