gwt序列化策略托管模式不同步 [英] gwt serialization policy hosted mode out of sync

查看:112
本文介绍了gwt序列化策略托管模式不同步的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当以托管模式运行我的GWT应用程序(gwt 2.0.4)时,调用运行在远程Tomcat上的RPC方法,我得到了GWT序列化异常:

  INFO:GwtRpcEventSrvc:错误:未找到序列化策略文件'/84EC7BA65AF8175BAA99B47877FDE163.gwt.rpc';你忘了把它包含在这个部署中吗? 

SEVERE:GwtRpcEventSrvc:警告:无法为模块'http:// host:19980 / MYAPP /'获取SerializationPolicy'84EC7BA65AF8175BAA99B47877FDE163';将使用传统的兼容1.3.3的序列化策略。您可能会遇到SerializationExceptions。

SEVERE:调度传入的RPC调用时发生异常
可能发生:com.google.gwt.user.client.rpc.SerializationException:java.lang.reflect.InvocationTargetException
.at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeWithCustomSerializer(ServerSerializationStreamWriter.java:760)
.at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeImpl(ServerSerializationStreamWriter。 java:723)
.at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serialize(ServerSerializationStreamWriter.java:612)
.at com.google.gwt.user.client。 rpc.impl.AbstractSerializationStreamWriter.writeObject(AbstractSerializationStreamWriter.java:129)
.at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter $ ValueWriter $ 8.write(ServerSerializationStreamWriter.java:152)
...
导致:com.google.gwt.user.client.rpc.SerializationException:输入'com.mypackage.data.MyData'不是ssignable to'com.google.gwt.user.client.rpc.IsSerializable'且没有自定义字段序列化程序。出于安全性考虑,此类型不会被序列化:instance = com.mypackage.data.MyData@1b061b06
.at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serialize(ServerSerializationStreamWriter.java:610)
.at com.google.gwt.user.client.rpc.impl.AbstractSerializationStreamWriter .writeObject(AbstractSerializationStreamWriter.java:129)
.at com.google.gwt.user.client.rpc.core.java.util.Collection_CustomFieldSerializerBase.serialize(Collection_CustomFieldSerializerBase.java:43)
.at com .google.gwt.user.client.rpc.core.java.util.LinkedList_CustomFieldSerializer.serialize(LinkedList_CustomFieldSerializer.java:36)
.... 33 more

托管模式使用不同的md5生成序列化策略文件(* .gwt.rpc),这些文件是在GWT编译期间创建的 - 这些文件部署在我的服务器上。 GWT缺少托管模式客户端需要的序列化策略文件。



在非托管模式下运行时一切正常。



我尝试通过Ant或Eclipse调试配置启动托管模式,结果相同。 GWT编译类路径和宿主模式类路径(包括)是相同的。



GWT编译Ant脚本:

 < java failonerror =truefork =trueclassname =com.google.gwt.dev.Compiler> 
< classpath>
< pathelement location =$ {basedir} / src/>
< pathelement location =$ {dir.build.root} / ProjectA / src/>
< pathelement location =$ {dir.build.root} / ProjectB / src/>
< pathelement location =$ {dir.build.root} / ProjectC / src/>
< pathelement location =$ {dir.build.root} / ProjectD / src/>
< pathelement location =$ {dir.build.root} / ProjectE / src/>
< pathelement location =$ {dir.root} / ProjectD / src/>
< pathelement location =$ {dir.root} /THIRDPARTY/build/athirdparty.jar/>
< pathelement location =$ {dir.commons.gwtcompiler} /gwt-user.jar/>
< pathelement location =$ {dir.commons.gwtcompiler} /gwt-dev.jar/>
< pathelement location =../ ExternalLibs / libs / gwt-log-3.0.0.jar/>
<! - GWT编译JAXB注释类所需的JAXB API源 - >
< pathelement location =../ ExternalLibs / nonshipjars / jaxb-api-src.zip/>
< / classpath>
< jvmarg value = - Xmx1g/>
< jvmarg value = - Dgwt.nowarn.metadata/>
< arg line = - localWorkers 2 -style OBF/>
< arg line = - war $ {basedir} / www/>
< arg line = - extra $ {basedir} / build/>
< arg value =com.myapp.Main/>
< / java>

托管模式启动 - Ant脚本:

 < target name =hosteddescription =运行托管模式> 
< java failonerror =truefork =trueclassname =com.google.gwt.dev.HostedMode>
< classpath>
< pathelement location =$ {basedir} / src/>
< pathelement location =$ {dir.build.root} / ProjectA / src/>
< pathelement location =$ {dir.build.root} / ProjectB / src/>
< pathelement location =$ {dir.build.root} / ProjectC / src/>
< pathelement location =$ {dir.build.root} / ProjectD / src/>
< pathelement location =$ {dir.build.root} / ProjectE / src/>
< pathelement location =$ {dir.root} / ProjectD / src/>
< pathelement location =$ {dir.root} /THIRDPARTY/build/athirdparty.jar/>
< pathelement location =$ {dir.commons.gwtcompiler} /gwt-user.jar/>
< pathelement location =$ {dir.commons.gwtcompiler} /gwt-dev.jar/>
< pathelement location =../ ExternalLibs / libs / gwt-log-3.0.0.jar/>
<! - GWT编译JAXB注释类所需的JAXB API源 - >
< pathelement location =../ ExternalLibs / nonshipjars / jaxb-api-src.zip/>
< / classpath>
< jvmarg value = - Xmx1g/>
< jvmarg value = - Dgwt.nowarn.metadata/>
< arg line =com.myapp.Main/>
< arg line = - startupUrl/>
< arg line =http:// host:19980 / MYAPP / Main.html/>
< arg line = - whitelist/>
< arg line =^ http [:] [/] [/] host [:] 19980/>
< arg line = - whitelist/>
< arg line =^ http [:] [/] [/] localhost/>
< arg line = - whitelist/>
< arg line =^ http [:] [/] [/] 127.0.0.1/>
< arg line = - port/>
< arg line =8080/>
< arg line = - noserver/>
< arg line = - logLevel/>
< arg line =DEBUG/>
< / java>
< / target>

RPC方法签名:

  public List< MyData> getSmpeWorkDddefZonesData(String processId); 

MyData 定义(在ProjectE中声明为非GWT项目 - 数据层):

  package com.mypackage.data; 

import java.io.Serializable;

public interface MyData extends Serializable {...

MyData链接从另一个GWT模块继承的模块:
com.mypackage.Data.gwt.xml

 <模块> 
< source path =data/>
< / module>

主模块 com.myapp.Main.gwt.xml
pre $
$继承名=com.mypackage.Data/>
...

如何使托管生成相同的序列化策略文件?

解决方案

我一直有同样的问题。我看到的唯一解决方案是确保双方都有相同的 .gwt.rpc 文件。



这意味着,每次你启动或重新加载开发模式,您必须用新生成的文件替换部署在您的Web服务器上的旧 .gwt.rpc 文件。



或者您将Dev Mode war输出目录指向Web服务器上下文。并确保Web服务器已启用自动部署。所以每次Dev模式更改文件时,Web服务器都会自动重新加载文件。


When running my GWT application (gwt 2.0.4) in hosted mode, calling RPC methods running on remote Tomcat, I get GWT serialization exception:

INFO: GwtRpcEventSrvc: ERROR: The serialization policy file '/84EC7BA65AF8175BAA99B47877FDE163.gwt.rpc' was not found; did you forget to include it in this deployment?

SEVERE: GwtRpcEventSrvc: WARNING: Failed to get the SerializationPolicy '84EC7BA65AF8175BAA99B47877FDE163' for module 'http://host:19980/MYAPP/'; a legacy, 1.3.3 compatible, serialization policy will be used.  Youmay experience SerializationExceptions as a result.

SEVERE: Exception while dispatching incoming RPC call
Throwable occurred: com.google.gwt.user.client.rpc.SerializationException: java.lang.reflect.InvocationTargetException
.at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeWithCustomSerializer(ServerSerializationStreamWriter.java:760)
.at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeImpl(ServerSerializationStreamWriter.java:723)
.at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serialize(ServerSerializationStreamWriter.java:612)
.at com.google.gwt.user.client.rpc.impl.AbstractSerializationStreamWriter.writeObject(AbstractSerializationStreamWriter.java:129)
.at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter$ValueWriter$8.write(ServerSerializationStreamWriter.java:152)
...
Caused by: com.google.gwt.user.client.rpc.SerializationException: Type 'com.mypackage.data.MyData' 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 serialized.: instance = com.mypackage.data.MyData@1b061b06
.at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serialize(ServerSerializationStreamWriter.java:610)
.at com.google.gwt.user.client.rpc.impl.AbstractSerializationStreamWriter.writeObject(AbstractSerializationStreamWriter.java:129)
.at com.google.gwt.user.client.rpc.core.java.util.Collection_CustomFieldSerializerBase.serialize(Collection_CustomFieldSerializerBase.java:43)
.at com.google.gwt.user.client.rpc.core.java.util.LinkedList_CustomFieldSerializer.serialize(LinkedList_CustomFieldSerializer.java:36)
.... 33 more

Hosted mode generates serializations policy files (*.gwt.rpc) with different md5 that those that were created during GWT compilation - these are deployed on my server. GWT is missing serialization policy file that hosted mode client wants.

When running in non-hosted mode everything is fine.

I tried to launch hosted mode via Ant or Eclipse debug configuration with the same results. GWT compilation classpath and hosted mode classpath (including) are the same.

GWT Compilation Ant script:

<java failonerror="true" fork="true" classname="com.google.gwt.dev.Compiler">
  <classpath>
    <pathelement location="${basedir}/src" />
    <pathelement location="${dir.build.root}/ProjectA/src" />
    <pathelement location="${dir.build.root}/ProjectB/src" />
    <pathelement location="${dir.build.root}/ProjectC/src" />
    <pathelement location="${dir.build.root}/ProjectD/src" />
    <pathelement location="${dir.build.root}/ProjectE/src" />
    <pathelement location="${dir.root}/ProjectD/src" />
    <pathelement location="${dir.root}/THIRDPARTY/build/athirdparty.jar" />
    <pathelement location="${dir.commons.gwtcompiler}/gwt-user.jar" />
    <pathelement location="${dir.commons.gwtcompiler}/gwt-dev.jar" />
    <pathelement location="../ExternalLibs/libs/gwt-log-3.0.0.jar" />
<!-- JAXB API sources needed for GWT compilation of JAXB annotated classes -->
    <pathelement location="../ExternalLibs/nonshipjars/jaxb-api-src.zip" />
  </classpath>
  <jvmarg value="-Xmx1g" />
  <jvmarg value="-Dgwt.nowarn.metadata" />
  <arg line="-localWorkers 2 -style OBF" />
  <arg line="-war ${basedir}/www" />
  <arg line="-extra ${basedir}/build" />
  <arg value="com.myapp.Main" />
</java>

Hosted mode launch - Ant script:

<target name="hosted" description="Run hosted mode">
  <java failonerror="true" fork="true" classname="com.google.gwt.dev.HostedMode">
    <classpath>
        <pathelement location="${basedir}/src" />
        <pathelement location="${dir.build.root}/ProjectA/src" />
        <pathelement location="${dir.build.root}/ProjectB/src" />
        <pathelement location="${dir.build.root}/ProjectC/src" />
        <pathelement location="${dir.build.root}/ProjectD/src" />
        <pathelement location="${dir.build.root}/ProjectE/src" />
        <pathelement location="${dir.root}/ProjectD/src" />
        <pathelement location="${dir.root}/THIRDPARTY/build/athirdparty.jar" />
        <pathelement location="${dir.commons.gwtcompiler}/gwt-user.jar" />
        <pathelement location="${dir.commons.gwtcompiler}/gwt-dev.jar" />
        <pathelement location="../ExternalLibs/libs/gwt-log-3.0.0.jar" />
    <!-- JAXB API sources needed for GWT compilation of JAXB annotated classes -->
        <pathelement location="../ExternalLibs/nonshipjars/jaxb-api-src.zip" />
    </classpath>
    <jvmarg value="-Xmx1g" />
    <jvmarg value="-Dgwt.nowarn.metadata" />
    <arg line="com.myapp.Main" />
    <arg line="-startupUrl" />
    <arg line=" http://host:19980/MYAPP/Main.html" />
    <arg line="-whitelist" />
    <arg line="^http[:][/][/]host[:]19980" />
    <arg line="-whitelist" />
    <arg line=" ^http[:][/][/]localhost" />
    <arg line="-whitelist" />
    <arg line="^http[:][/][/]127.0.0.1" />
    <arg line="-port" />
    <arg line="8080" />
    <arg line="-noserver" />
    <arg line="-logLevel" />
    <arg line="DEBUG" />
  </java>
</target>

RPC method signature:

public List<MyData> getSmpeWorkDddefZonesData(String processId);

MyData definition (declared in ProjectE that is non-GWT project - data tier):

package com.mypackage.data;

import java.io.Serializable;

public interface MyData extends Serializable {...

MyData is linked in module inherited from another GWT module: com.mypackage.Data.gwt.xml:

<module>
  <source path="data" />
</module>

Main module com.myapp.Main.gwt.xml:

...
  <inherits name="com.mypackage.Data" />
...

How to make hosted generate the same serialization policy files?

解决方案

I've been having the same problem. The only solution I see, is to make sure you have the same .gwt.rpc files on both sides.

That means, everytime you start or reload Dev Mode, you have to replace the old .gwt.rpc files deployed on your web server with the newly generated ones.

Or you point the Dev Mode war output directory to the web server context. And make sure the web server has auto-deploy turned on. So every time the files are changed by Dev Mode, the web server automatically reloads the files.

这篇关于gwt序列化策略托管模式不同步的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆