2012-07-14 67 views
0

我已经尝试将AutoBeans添加到我们的GWT应用程序中,以便将我们的对象序列化为cookie,然后再读取它们。使用AutoBeans作为参数的GWT RPC调用

但是,在这之后,我无法用反序列化的对象调用GWT RPC方法调用。任何人都可以提供任何有关为什么RPC调用失败的见解?

示范:

@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方法

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; 
    } 
    } 

然后运行失败了,和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()); 
     } 
    }); 

此外,我看不出在服务器日志中的任何请求。

任何人都可以帮忙吗?非常感谢

回答

1

我发现如何使这项工作。

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

这是有道理的,因为由GWT中的AutoBean反序列化返回的对象类型仅仅是一个声明的接口类型...实际的对象类型是某种代理,并且该代理显然不是它自己可序列化的。

所以我在这里要解决的办法是从GWT在客户端发送的序列化JSON字符串到服务器,服务器执行反序列化到同一类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 
}