Pregunta

Tengo un servicio RPC con el siguiente método:

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

Pero consigo 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 ... podía usar mi propia interfaz en lugar (algo así como AsyncDataInterface, cosa que implementa la interfaz Serializable), pero el hecho es que mi método devolverá una lista de objetos personalizados y básica objetos (tales como cadenas, 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 para ese tipo de situación?
¿Fue útil?

Solución

Cuando los objetos que pasan a través de su llamada RPC es una buena práctica para declarar tipos de parámetros concretos en la interfaz RPC. Si por alguna razón no se puede utilizar clase concreta en la interfaz RPC tratar de ser lo más específico posible.

Esto es porque el compilador GWT mientras que emite Javascript tiene que tener en cuenta todas las variantes posibles de la lista en la unidad de compilación. Esto incluye todas las clases que se extienden de lista y la interfaz Serializable en la ruta de clase. Las permutaciones pueden ser enormes, lo que afectará su tiempo de compilación, así como el tamaño de descarga de aplicaciones.

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 este modo el compilador tiene que generar unidades de compilación de sólo extensiones de ArrayList y YourType. El benifit es en tiempos más rápidos de compilación y archivos javascript compilados más pequeños, por lo tanto, más rápido descargas de su aplicación.

En caso de tener que devolver una amplia gama de objetos no relacionados en su llamada RPC, intente crear un objeto de clase de contenedor y el retorno de la clase contenedora con el valor de retorno envueltos. Utilice la clase contenedora en la definición del método RPC. Resistir la tentación de declarar el campo envuelto como objeto o Serializable, se le niega todos los beneficios de serialización que adquirió mediante el uso de un envoltorio. En su lugar se puede definir una interfaz de contenedor y un pequeño conjunto de aplicación de contenedor para cada tipo de hormigón que desea devolver su llamada a través de RPC.

Otros consejos

Es posible que desee comprobar que la serialización archivo de política no es la fuente del problema.

Presupuesto de GWT documentación :

  

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 serialización durante la compilación de GWT. El archivo de política serialización contiene una lista blanca de tipos permitidos que pueden ser serializado. Su nombre es un nombre de hash fuerte seguido de .gwt.rpc. Con el fin de activar el soporte de java.io.Serializable, los tipos que la aplicación va a enviar a través del cable deben ser incluidos en la política de serialización lista blanca. Además, el archivo de política de serialización debe implementarse en el servidor web como un recurso público, accesible desde un RemoteServiceServlet través ServletContext.getResource (). Si no se implementa correctamente, RPC se ejecutará en modo de compatibilidad 1.3.3 y se niegan a serializar tipos de aplicación java.io.Serializable.

No veo el punto de definir la lista como valor de retorno. El tipo Serializable proporciona ninguna información adicional en la declaración de API del 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 ningún antepasado común que no sea objeto, me gustaría utilizar List .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top