自从我做GWT以来已经有一段时间了,我需要快速做一些小事。我设置了一些东西,现在我需要一个RPC,但它失败了。
RPC应该给我一个ArrayList,而Vacancy位于#projectname#.client.model中。
调用在#projectname#.client.model中进行。
我的服务的接口位于#project#name.client.Service中。
最后,调用当然是#projectname#.server。
空缺实现了IsSerializable。我从运行RPC获得的异常如下:
Starting Jetty on port 8888
[WARN] Exception while dispatching incoming RPC call
com.google.gwt.user.client.rpc.SerializationException: Type 'firsteight.client.model.Vacancy' was not included in the set of types which can be serialized by this SerializationPolicy or its Class object could not be loaded. For security purposes, this type will not be serialized.: instance = firsteight.client.model.Vacancy@15fdd2f
at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serialize(ServerSerializationStreamWriter.java:619)
at com.google.gwt.user.client.rpc.impl.AbstractSerializationStreamWriter.writeObject(AbstractSerializationStreamWriter.java:126)
at com.google.gwt.user.client.rpc.core.java.util.Collection_CustomFieldSerializerBase.serialize(Collection_CustomFieldSerializerBase.java:44)
at com.google.gwt.user.client.rpc.core.java.util.ArrayList_CustomFieldSerializer.serialize(ArrayList_CustomFieldSerializer.java:39)
at com.google.gwt.user.client.rpc.core.java.util.ArrayList_CustomFieldSerializer.serializeInstance(ArrayList_CustomFieldSerializer.java:51)
at com.google.gwt.user.client.rpc.core.java.util.ArrayList_CustomFieldSerializer.serializeInstance(ArrayList_CustomFieldSerializer.java:28)
at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeImpl(ServerSerializationStreamWriter.java:740)
at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serialize(ServerSerializationStreamWriter.java:621)
at com.google.gwt.user.client.rpc.impl.AbstractSerializationStreamWriter.writeObject(AbstractSerializationStreamWriter.java:126)
at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter$ValueWriter$8.write(ServerSerializationStreamWriter.java:153)
at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeValue(ServerSerializationStreamWriter.java:539)
at com.google.gwt.user.server.rpc.RPC.encodeResponse(RPC.java:616)
at com.google.gwt.user.server.rpc.RPC.encodeResponseForSuccess(RPC.java:474)
at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:571)
at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:208)
at com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:248)
at com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:62)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:362)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:729)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at org.mortbay.jetty.handler.RequestLogHandler.handle(RequestLogHandler.java:49)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at org.mortbay.jetty.Server.handle(Server.java:324)
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:505)
at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:843)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:647)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:380)
at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:395)
at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:488)
我制作的RPC如下:
void getVacs() {
try {
homeService.getVacancies(new AsyncCallback<ArrayList<Vacancy>>() {
public void onFailure(Throwable caught)
{
RootPanel.get("grayblock").add(new HTML("Failed:" + caught.getMessage()));
}
public void onSuccess(ArrayList<Vacancy> result)
{
RootPanel.get("grayblock").add(new HTML(result.get(0).getTitle()));
}
});
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
我以为我已经完成了所有我需要的Vacancy Serializable,并且一个空位的ArrayList作为RPC的返回类型算作具有Vacancy作为返回类型..对吗?我做错了什么?
提前致谢!
答案 0 :(得分:32)
这通常是由于使用不可序列化的类引起的,如果您的类没有实现com.google.gwt.user.client.rpc.IsSerializable
或者您忘记添加空构造函数,则可能会发生这种情况。
要传递bean,您必须满足以下要求(来自GWT站点):
即使您满足这些要求,GWT编译器也可能会说:
未包含在可以的类型集中 由此SerializationPolicy序列化或其Class对象不能 加载。出于安全考虑,此类型不会被序列化: instance = @
问题可能有不同的原因。这是他用来解决问题的完整检查清单:
PS:从http://isolasoftware.it/2011/03/22/gwt-serialization-policy-error/复制,因为该网站目前不可用。如果您想阅读原始文章,请使用上述网址从谷歌搜索,并从谷歌网络缓存中读取。
答案 1 :(得分:7)
此异常的另一个原因是浏览器端的过时javascript。我不得不重新加载(CTRL + F5)代码,这个例外消失了。
答案 2 :(得分:0)
当我使用子列表时,我也遇到了这个错误:
return myList.subList(fromIndex, toIndex);
答案 3 :(得分:0)
在我的情况下,我的target
文件夹中有一些旧缓存没有正确更新。我不得不重建项目(Maven - &gt; Update Project),然后就可以了。
答案 4 :(得分:0)
首先,确保定义了一个空构造函数。
如果没有,你的班级将无法序列化......
如果你有一个空构造函数,请确保你的类(或扩展链中的任何类)实现IsSerializable (或任何其他扩展IsSerialisable的接口)
如果您的班级实施了IsSerialisable,请检查非最终 ...
答案 5 :(得分:0)
如Cipous所述,在我的情况下,我在Pentaho BI Server的服务器输出中引发了此异常。一个简单的硬重装(CTRL + F5)就可以解决问题。