2010-06-17 14 views
13

que tienen un servicio RPC con el siguiente método:gwt - ¿Utiliza la lista <Serializable> en una llamada RPC?

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

pero me da una advertencia cuando se analiza este método, y luego la llamada RPC falla

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 el Serializ) interfaz capaz) pero el hecho es que mi método devolverá una lista de objetos personalizados Y objetos básicos (como Strings, int ....).

Así que mis preguntas son:

  • ¿Es un comportamiento standart? (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?

Respuesta

27

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

Así que el mejor enfoque es definir su interfaz como

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

en lugar de

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

De esa manera compilador debe generar unidades de compilación de sólo extensiones de 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 deba 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.

1

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

Quote from GWT documentation:

Sin embargo, hay una condición para activar el soporte de java.io.Serializable en el nuevo sistema de 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.

0

No veo el punto de definir la Lista < Serializable> como 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 <?>.

Cuestiones relacionadas