java - 使用 AutoBeans 以接口(interface)作为参数的 GWT RPC 调用

标签 java gwt serialization gwt-rpc autobean

我尝试将 AutoBeans 添加到我们的 GWT 应用程序中,将我们的对象序列化为 cookie,然后读回它们。

但是,此后我在使用反序列化对象调用 GWT RPC 方法时遇到了问题。谁能提供有关 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());
      }
    });

此外,我在服务器日志中没有看到任何请求。

有人可以帮忙吗?非常感谢

最佳答案

我找到了如何做到这一点。

我没有声明服务接受接口(interface) Worker 的类型,而是将其更改为接受序列化 JSON 字符串作为参数,然后使用 Jackson 将其转换为我在服务器上需要的类型.

这是有道理的,因为 GWT 中 AutoBean 反序列化返回的对象类型只是一个声明的 Worker 接口(interface)类型...实际的对象类型是某种代理,并且该代理显然是本身不可序列化。

因此,我在这里采用的解决方案是将序列化的 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
}

关于java - 使用 AutoBeans 以接口(interface)作为参数的 GWT RPC 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11487639/

相关文章:

java - 如何将我在命令部分编写的句子保存到文本文件

c# - XmlSerializer 不反序列化 DateTime

java - 如何在 Spring Boot 中使用 KMS 之前先解密 application.properties 中的密码

gwt - 大型 GWT 项目和编译时间问题

css - 为什么 "word-wrap"css 样式在 <table> (GWT) 中不起作用?

java - gwt中的Remote Service被执行了两次

java - 在 Linux Mint 上的 Eclipse 中使用箭头键在调用层次结构中导航

java - 如何在 Java 中比较时间?

java - 如何使其实时数据观察器基于用户点击事件工作并接受一些用户输入,但应该从 onCreate 开始观察?

java - Java中如何保存对象?构造函数中的反序列化