0

AutoBeansをGWTアプリに追加して、オブジェクトをCookieにシリアル化してから、読み直してみました。

ただし、この後、逆シリアル化されたオブジェクトを使用してGWTRPCメソッド呼び出しを呼び出すのに問題があります。RPC呼び出しが失敗する理由について誰かが洞察を提供できますか?

デモンストレーション:

public interface Worker {
    public String getTitle();

    public void setTitle(String title);
  }

  public interface WorkerFactory extends AutoBeanFactory {
    AutoBean<Worker> createWorker();
  }

  public class MyObject implements Worker {
    private String title;

    public MyObject() {
    }

    public String getTitle() {
      return title;
    }

    public void setTitle(String title) {
      this.title = title;
    }
  }

次に、次のコマンドで実行します。

  @Test
  public void testMyObject() {
    MyObject obj = new MyObject();
    obj.setTitle("titely");

    WorkerFactory factory = AutoBeanFactorySource.create(WorkerFactory.class);
    AutoBean<Worker> bean = factory.create(Worker.class, obj);
    String json = AutoBeanCodex.encode(bean).getPayload();
    System.out.println("Json is: " + json);

    bean = AutoBeanCodex.decode(factory, Worker.class, json);
    Worker newObject = bean.as();
    System.out.println("Object title is: " + newObject.getTitle());
  }

...これは期待どおりに機能しているようです:

Json is: {"title":"titely"} 
Object title is: titely

しかし今、私のRPCメソッドは失敗し、それはcaught.getMessage()ですnull

サービス定義:

@RemoteServiceRelativePath("workerService")
interface WorkerService {
   public void doWork(Worker worker);
}

public interface WorkerServiceAsync {
  void doWork(Worker worker, AsyncCallback<Void> callback);
}

public class WorkerServiceImpl extends RemoteServiceServlet implements WorkerService {
  @Override
  public void doWork(Worker worker) {
      // Do stuff that never gets called
    }
}

呼び出される:

WorkerServiceAsync WORKER_SERVICE = GWT.create(WorkerService.class);
WORKER_SERVICE.doWork(newObject, new AsyncCallback<Void>() {
      public void onSuccess(Void result) {
        Window.alert("Never get here!");
      }

      public void onFailure(Throwable caught) {
        Window.alert("Get here, but message is blank: " + caught.getMessage());
      }
    });

さらに、サーバーログにリクエストが表示されません。

誰か助けてもらえますか?どうもありがとう

4

1 に答える 1

1

私はこれを機能させる方法を見つけました。

の型を受け入れるようにサービスを宣言する代わりに、シリアル化されたJSON文字列をパラメーターとして受け入れるように変更し、 Jacksoninterface Workerを使用してサーバー上で必要な型に変換します。

GWTのAutoBeanデシリアライズによって返されるオブジェクトタイプは単に宣言されたインターフェイスタイプであるため、これは理にかなっていますWorker...実際のオブジェクトタイプはある種のプロキシであり、そのプロキシ自体は明らかにシリアル化できません。

したがって、ここで使用する解決策は、シリアル化されたJSON文字列をクライアントのGWTからサーバーに送信することです。サーバーでは、次のWorkerコードを使用して、同じクラスへの逆シリアル化が行われます。

// on the server
public void doWork(String jsonString) {
    ObjectMapper jsonHelper = new ObjectMapper();
    ObjectReader reader = jsonHelper.reader(new TypeReference<MyObject>() {});
    MyObject actualHardObject;
    try {
      actualHardObject = reader.readValue(jsonString);
    } catch (IOException e) {
      log.severe("Couldn't parse json param: " + e.getMessage());
    }

    // do whatever you want with actualHardObject now
}
于 2012-07-15T02:03:32.187 に答える