5

GWT アプリがロードされたときに最初に行うことは、RequestFactory を介してサーバーから現在ログインしているユーザーを要求することです。続行する方法を知るためにユーザーのプロパティが必要なため、これはブロックされます。これには 500 ミリ秒未満しかかかりませんが、この間にアプリがブロックされるのは本当にイライラします。jsp が生成された時点でサーバー上にユーザーが既に存在するため、シリアル化されたユーザーを jsp に追加して、この要求を完全に削除してみませんか?

これを行うには2つの問題があります。

  • User を UserProxy に変換する必要があります
  • GWT がデシリアライズしやすい方法で UserProxy をシリアライズする必要があります。

#1を行う良い方法がわかりませんでした。このロジックは ServiceLayerDecorator に埋め込まれているように見えますが、分離する簡単な方法はありませんか? 私はここで間違っているかもしれません。

2 番目の方法はProxySerializerを使用する方が簡単に思えますが、サーバー上で requestfactory を操作するにはどうすればよいでしょうか? GWT.createサーバー上で呼び出すことはできません。

私はAutoBeansを調べてきましたが、これは上記の #1 を処理しません。私の UserProxy には、維持したい他の EntityProxy のコレクションへの参照があります。

4

4 に答える 4

5

プロキシ用にAutoBeanFactoryを作成すると、AutoBeansを使用できます。

  • UserをUserProxyに変換するには: サーバー側を作成しRequestFactory、同じ通常のリクエストを呼び出します。応答にはUserProxy(ただしサーバー上に)含まれます。

  • UserProxyをシリアル化するには:

    AutoBean<UserProxy> bean = AutoBeanUtils.getAutoBean(receivedUserProxy);

    String json = AutoBeanCodex.encode(bean).getPayload();

  • クライアントでUserProxyを逆シリアル化するには:

    AutoBean<UserProxy> bean = AutoBeanCodex.decode(userAutoBeanFactory, UserProxy.class, json);

サーバー上にインプロセスRequestFactoryを作成する(チュートリアル):

public static <T extends RequestFactory> T create( Class<T> requestFactoryClass ) {
  ServiceLayer serviceLayer = ServiceLayer.create();
  SimpleRequestProcessor processor = new SimpleRequestProcessor( serviceLayer );
  T factory = RequestFactorySource.create( requestFactoryClass );
  factory.initialize( new SimpleEventBus(), new InProcessRequestTransport(processor) );
  return factory;
}
于 2012-03-29T19:00:41.960 に答える
3

作成できる場合は、これにも AutoBeans を使用できますUser implements UserProxy。プロキシはゲッター/セッターとのインターフェースであるため、機能します。

interface UserFactory implements AutoBeanFactory
{
  AutoBean<UserProxy> user(UserProxy toWrap); // wrap existing instance in an AutoBean
}

次に、サーバー上で autobean を作成し、json にシリアル化できます。

UserFactory factory = AutoBeanFactorySource.create(UserFactory.class)
AutoBean<UserProxy> userProxyBean = factory.user( existingUserPojo );

// to convert AutoBean to JSON
String json = AutoBeanCodex.encode(userProxyBean).getPayload();

クライアントでは、 AutoBeanCodex.decode を使用して JSON をデシリアライズして Bean に戻すことができます

于 2012-03-27T13:12:02.653 に答える
1

サーバー上で (または実際の JVM から) GWT.create を呼び出すことはできませんが、多くの場合、代わりにサーバー用に設計された JVM 互換のメソッドを呼び出すことができます。この場合は、 を参照してくださいRequestFactorySource.create

RequestFactory を使用してサーバーにデータを読み取らせ、データを出力させるのは少し面倒な場合があります。これがどのように機能するかを示すデモ例を次に示します (gwt 2.4 を使用し、メイン ブランチは 2.3 で同じことを行います) https: //github.com/niloc132/tvguide-sample-parent/blob/gwt-2.4.0/tvguide-client/src/main/java/com/acme/gwt/server/TvViewerJsonBootstrap.java - まったく同じではありませんあなたは後ですが、これと同じアイデアを使用して、クライアントで読み取ることができるプロキシストアに文字列を入力することができる場合があります ( https://github.com/niloc132/tvguide-sample-parent/blob/を参照)。 gwt-2.4.0/tvguide-client/src/main/java/com/acme/gwt/client/TvGuide.java )。

基本的な考え方は、リクエスト (id、呼び出し、および with() 引数を含む) を作成して、プロキシ ビルダーが一貫した方法ですべての適切な部分を作成し、それをSimpleRequestProcessorインスタンスに渡すことです。インスタンスはサーバーの部分を介して実行します。それは通常でしょう。(エンティティ管理システムはおそらく、追加のルックアップを避けるためにエンティティをキャッシュしておく必要があります。それ以外の場合は、SRP が内部で行う作業の一部をモデル化する必要があります。)ProxySerializerをラップするProxyStoreは、サーバーから送信された完全な RF メッセージを期待しています。そのため、かなりの量のメッセージ ブックキーピングを正しく行う必要があります。

于 2012-03-17T19:10:03.810 に答える
1

GWT Google Groupで答えを見つけました。すべてのクレジットはNisha Sowdri NMに送られます。

サーバー側のエンコーディング:

DefaultProxyStore store = new DefaultProxyStore();
ProxySerializer ser = requests.getSerializer(store);
final String key = ser.serialize(userProxy);
String message = key + ":" + store.encode();

クライアント側のデコード:

String[] parts = message.split(":", 2);
ProxyStore store = new DefaultProxyStore(parts[1]);
ProxySerializer ser = requests.getSerializer(store);
UserProxy user = ser.deserialize(UserProxy.class, parts[0]);
于 2012-04-08T17:02:23.947 に答える