2011-08-12 15 views
7

Al ejecutar mi aplicación GWT (GWT 2.0.4) en modo alojado, llamar a los métodos de RPC que se ejecutan en Tomcat remoto, consigo GWT serialización excepción:GWT modo alojado fuera de sincronía

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 = [email protected] 
.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 

modo Alojado genera los archivos de política de serializaciones (* .gwt.rpc) con md5 diferente a los que se crearon durante la compilación de GWT; estos se implementan en mi servidor. A GWT le falta el archivo de política de serialización que desea el cliente del modo alojado.

Cuando se ejecuta en modo no alojado, todo está bien.

Intenté iniciar el modo alojado a través de la configuración de depuración Ant o Eclipse con los mismos resultados. El classpath de compilación GWT y el classpath del modo alojado (incluido) son los mismos. guión

GWT compilación Ant:

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

modo Alojado lanzamiento - script Ant: Método

<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 firma:

public List<MyData> getSmpeWorkDddefZonesData(String processId); 

MyData definición (declarada en Projecte es decir no -Proyecto GWT - nivel de datos):

package com.mypackage.data; 

import java.io.Serializable; 

public interface MyData extends Serializable {... 

MyData se liga en el módulo heredado de otro módulo GWT: com.mypackage.Data.gwt.xml:

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

módulo principal com.myapp.Main.gwt.xml:

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

cómo hacer que acogió generar los mismos archivos de políticas de serialización?

Respuesta

3

He estado teniendo el mismo problema. La única solución que veo es asegurarse de tener los mismos archivos .gwt.rpc en ambos lados.

Eso significa que, cada vez que inicie o recargue el Modo Dev, debe reemplazar los archivos .gwt.rpc anteriores implementados en su servidor web con los recién generados.

O señala el directorio de salida de guerra del modo Dev al contexto del servidor web. Y asegúrese de que el servidor web tenga activada la implementación automática. Por lo tanto, cada vez que se cambian los archivos por el Modo Dev, el servidor web vuelve a cargar automáticamente los archivos.

+2

Gracias, ayudó! Solo para agregar más detalles: tuve que iniciar el modo alojado con la opción -war/ruta/a/mi/construida/guerra en lugar de la ruta predeterminada. – foch

0

Sobre la base de lo que veo en com.google.gwt.user.rebind.rpc.ProxyCreator GWT genera los nombres de la política de serialización .gwt.rpc archivos por su contenido (MD5).

Por lo tanto, por alguna razón, la política de serialización en el modo Super Dev es diferente a la generada durante la compilación normal.

El enfoque siguiente solucionó el problema para mí:

  1. política Abra el archivo de serialización .gwt.rpc generada por la acumulación periódica
  2. Abra la política de serialización archivo .gwt.rpc genera para el modo Super Dev. Puede encontrar dónde está buscando en el directorio de trabajo impreso en el inicio del Modo Super Dev. P.ej. en mi caso fue: "workDir: C: \ Users \ your_user \ AppData \ Local \ Temp \ gwt-codeserver-5658052675265790575.tmp"
  3. Compara los 2 archivos; esto podría darte una buena pista sobre dónde está el problema puede ser. En mi caso, se agregaron 2 tipos innecesarios a la política de serialización y simplemente pude eliminarlos del proyecto por completo.
  4. Después de fijar las discrepancias el nombre .gwt.rpc archivos deben ser idénticos nuevo y el problema se solucionará :)
Cuestiones relacionadas