使用RPC记录的异常会抛出IncompatibleRemoteServiceException

时间:2013-04-03 14:16:13

标签: gwt gwt-rpc gwt2

正确,基础知识,它在GWT2.5.0 / JDK1.6上运行,并且随着文档的设置或多或少地设置

gwt.xml

<inherits name="com.google.gwt.logging.Logging" />

<set-property name="gwt.logging.simpleRemoteHandler"
    value="ENABLED" />
<set-property name="gwt.logging.logLevel" value="INFO" />
<set-property name="gwt.logging.enabled" value="TRUE" />
<set-property name="gwt.logging.developmentModeHandler"
    value="ENABLED" />
<set-property name="gwt.logging.systemHandler" value="DISABLED" />
<set-property name="gwt.logging.popupHandler" value="DISABLED" />
<set-property name="gwt.logging.consoleHandler" value="ENABLED" />
<set-property name="gwt.logging.firebugHandler" value="ENABLED" />

我用以下代码强制异常,只是一个简单的NullPointException

     try {
        Level n = null;
        n.getName();
      } catch (NullPointerException ex) {             
        logger.log(Level.SEVERE, "Null Exception Hit", ex);
      }

但由于某种原因,当向服务器抛出异常时抛出此错误

[WARN] remoteLogging: An IncompatibleRemoteServiceException was thrown while processing this call.
com.google.gwt.user.client.rpc.IncompatibleRemoteServiceException: Type 'com.google.gwt.core.client.impl.SerializableThrowable' was not assignable to 'com.google.gwt.user.client.rpc.IsSerializable' and did not have a custom field serializer. For security purposes, this type will not be deserialized.
at com.google.gwt.user.server.rpc.RPC.decodeRequest(RPC.java:323)
at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:206)

RPC servlet已正确配置,如果我只抛出消息而不是异常,它会立即返回服务器。

根据远程服务器日志记录的文档,这应该“正常工作”,我不明白为什么会被抛出。在我看来,SerializableThrowable应该是可序列化的。我知道你必须通过一些箍来让你自己的类可序列化,但我读过的所有内容都说我应该能够将异常重新抛回服务器而不会出现问题。有任何想法吗?看起来好像2.5.0 serializableThrowable已被移动到com.google.gwt.core.shared.SerializableThrowable,但我不认为这样做。

1 个答案:

答案 0 :(得分:1)

因为Exception的超类是Throwable,它实现java.io.Serializable

需要注意的重要一点是,在完整的Java JRE中实现java.io.Serializable的类都没有在GWT的模拟JRE中实现java.io.Serializable。这意味着在JRE中实现java.io.Serializable的类型如Throwable,或者StackTraceElement将无法通过GWT RPC传输,因为客户端将无法序列化/反序列化它们即可。但是,对于其他类型(如String,Number等)而言,这不是问题,它们不会在模拟的JRE中实现java.io.Serializable,而是具有自定义字段序列化程序,以便它们可以正确序列化。

GWT serialization policy