tutorial java gwt serialization rpc gwt-rpc

java - tutorial - gwt-¿Usando List<Serializable> en una llamada RPC?



gwt json (3)

Tengo un servicio RPC con el siguiente método:

public List<Serializable> myMethod(TransactionCall call) {...}

Pero recibo una advertencia cuando se analiza este método y luego falla la llamada de rpc

Analyzing ''my.project.package.myService'' for serializable types Analyzing methods: public abstract java.util.List<java.io.Serializable> myMethod(my.project.package.TransactionCall call) Return type: java.util.List<java.io.Serializable> [...] java.io.Serializable Verifying instantiability (!) Checking all subtypes of Object wich qualify for serialization

Parece que no puedo usar Serializable para mi Lista ... Podría usar mi propia interfaz (algo así como AsyncDataInterface, que implementa la interfaz Serializable) pero el hecho es que mi método devolverá una lista de objetos personalizados Y objetos básicos (tales como Strings, int ....).

Entonces mis preguntas son:

  • ¿Es un comportamiento estándar? (No puedo entender por qué no puedo usar esta interfaz en ese caso)
  • ¿Alguien tiene una solución alternativa para ese tipo de situación?

Al pasar objetos a través de llamadas RPC, es una buena práctica declarar tipos de parámetros concretos en la interfaz RPC. Si por algún motivo no puede usar la clase concreta en la interfaz RPC, intente ser lo más específico posible.

Esto se debe a que el compilador de GWT al emitir javascript debe tener en cuenta todas las variantes posibles de List en la unidad de compilación. Esto incluye todas las clases que extienden la interfaz Lista y Serializable en la ruta de la clase. Las permutaciones pueden ser enormes, lo que afectará su tiempo de compilación así como el tamaño de descarga de la aplicación.

Entonces, el mejor enfoque es definir su interfaz como

public ArrayList<YourType> myMethod(TransactionCall call) {...}

más bien que

public List<Serializable> myMethod(TransactionCall call) {...}

De esta forma, el compilador solo debe generar unidades de compilación para las extensiones ArrayList y YourType. El beneficio está en tiempos de compilación más rápidos y en archivos compilados de JavaScript más pequeños, por lo tanto, descargas más rápidas de su aplicación.

En caso de que tenga que devolver una amplia gama de objetos no relacionados en su llamada RPC, intente crear una clase contenedora y devolver el objeto de la clase contenedora con el valor devuelto. Use la clase contenedora en la definición del método RPC. Resista la tentación de declarar el campo envuelto como Objeto o Serializable, negará todos los beneficios de serialización que haya obtenido mediante el uso de un contenedor. En su lugar, puede definir una interfaz Wrapper y un pequeño conjunto de implementaciones Wrapper para cada tipo concreto que desee devolver a través de su llamada RPC.


Es posible que desee comprobar que el archivo de política de serialización no sea el origen del problema.

Cita de la documentación de GWT :

Sin embargo, hay una condición para habilitar el soporte para java.io.Serializable en el nuevo sistema GWT RPC.

RPC ahora genera un archivo de política de serialización durante la compilación de GWT. El archivo de políticas de serialización contiene una lista blanca de tipos permitidos que pueden ser serializados. Su nombre es un fuerte nombre hash seguido de .gwt.rpc. Para habilitar el soporte para java.io.Serializable, los tipos que su aplicación enviará a través del cable deben incluirse en la lista blanca de política de serialización. Además, el archivo de políticas de serialización debe implementarse en su servidor web como un recurso público, accesible desde un ServidorServicio Remoto a través de ServletContext.getResource (). Si no se implementa correctamente, RPC se ejecutará en el modo de compatibilidad 1.3.3 y se negará a serializar los tipos que implementan java.io.Serializable.


No veo el sentido de definir List <Serializable> como el valor de retorno. El tipo Serializable no proporciona información adicional en la declaración de la API de servicio. GWT hará la verificación de serialización en tiempo de ejecución de todos modos.

En su caso, donde los elementos de la lista no tienen un antecesor común distinto de Object, usaría List <?>.