gwt – 在RPC调用中使用List ?
我有一个RPC服务,使用以下方法:
public List myMethod(TransactionCall call) {...}
但是在分析此方法时我收到警告,然后rpc调用失败
Analyzing 'my.project.package.myService' for serializable types Analyzing methods: public abstract java.util.List myMethod(my.project.package.TransactionCall call) Return type: java.util.List [...] java.io.Serializable Verifying instantiability (!) Checking all subtypes of Object wich qualify for serialization
似乎我不能将Serializable用于我的List …我可以使用我自己的界面(类似于AsyncDataInterface,它实现了Serializable接口),但事实是我的方法将返回一个列表自定义对象和基本对象(如as Strings,int ….)。
所以我的问题是:
- 这是一种标准行为吗? (我无法弄清楚为什么在这种情况下我不能使用这个界面)
- 有没有人有这种情况的解决方法?
在RPC调用中传递对象时,最好在RPC接口中声明具体的参数类型。 如果由于某种原因您无法在RPC接口中使用具体类,请尝试尽可能具体。
这是因为GWT编译器在发出javascript时必须考虑编译单元中List的所有可能变体。 这包括在类路径中扩展List和Serializable接口的所有类。 排列可能很大,这将影响您的编译时间以及应用程序下载大小。
因此,最好的方法是将您的界面定义为
public ArrayList myMethod(TransactionCall call) {...}
而不是
public List myMethod(TransactionCall call) {...}
这样编译器只需为ArrayList和YourType扩展生成编译单元。 好处是编译时间更短,编译的javascript文件更小,从而加快了应用程序的下载速度。
如果您必须在RPC调用中返回各种不相关的对象,请尝试创建包装类并返回包装类的包装返回值的对象。 在RPC方法定义中使用包装类。 抵制将包装字段声明为Object或Serializable的冲动,您将取消使用包装器获得的所有序列化优势。 相反,您可以为希望通过RPC调用返回的每个具体类型定义一个Wrapper接口和一小组Wrapper实现。
您可能希望检查序列化策略文件不是问题的根源。
从GWT文档引用 :
但是,有一个条件可以在新的GWT RPC系统中启用对java.io.Serializable的支持。
RPC现在在GWT编译期间生成序列化策略文件。 序列化策略文件包含可以序列化的允许类型的白名单。 它的名称是一个强大的哈希名称,后跟.gwt.rpc。 为了支持java.io.Serializable,应用程序将通过网络发送的类型必须包含在序列化策略白名单中。 此外,序列化策略文件必须作为公共资源部署到Web服务器,可通过ServletContext.getResource()从RemoteServiceServlet访问。 如果未正确部署,RPC将以1.3.3兼容模式运行,并拒绝序列化实现java.io.Serializable的类型。
我没有看到将List
在你的情况下,list元素除了Object之外没有共同的祖先,我会使用List <?>。