Envío persistente de instancias JDO sobre GWT-RPC
(6)
Empecé a aprender Google Web Toolkit y terminé de escribir la aplicación tutorial Stock Watcher.
¿Es correcto mi razonamiento de que si uno quiere persistir en un objeto comercial (como un Stock) usando JDO y enviarlo de ida y vuelta al cliente a través de RPC, entonces uno tiene que crear dos clases separadas para ese objeto : uno con las anotaciones JDO para persistirlo en el servidor y otro que se puede serializar y usar a través de RPC?
Noté que Stock Watcher tiene clases separadas y puedo teorizar por qué:
- De lo contrario, el compilador gwt intentaría generar javascript para todo lo que hace referencia a la clase persistente como JDO y com.google.blah.users.User, etc.
- También puede haber lógica en la clase del lado del servidor que no se aplica al cliente y viceversa.
Solo quiero asegurarme de entender esto correctamente. No quiero tener que crear dos versiones de todas mis clases de objetos comerciales que quiero usar sobre RPC si no es necesario .
Creo que un mejor formato para enviar objetos a través de GWT es a través de JSON. En este caso, desde el servidor se enviaría una cadena JSON que luego tendría que analizarse en el cliente. La ventaja es que el Javascript final que se representa en el navegador tiene un tamaño más pequeño. lo que hace que la página se cargue más rápido.
En segundo lugar, para enviar objetos a través de GWT, los objetos deben ser serializables. Este puede no ser el caso para todos los objetos
En tercer lugar, GWT tiene funciones incorporadas para manejar JSON ... por lo que no hay problemas en el extremo del cliente
Finalmente encontré una solución. No cambie su objeto en absoluto, pero para el listado hágalo de esta manera:
List<YourCustomObject> secureList=(List<YourCustomObject>)pm.newQuery(query).execute();
return new ArrayList<YourCustomObject>(secureList);
El problema real no está en serializar el objeto ... el problema es serializar la clase de recopilación implementada por Google y no se puede serializar.
La respuesta corta es: no es necesario crear clases duplicadas .
Te recomiendo que eches un vistazo a la siguiente discusión de grupos de google en la lista de contribuidores de gwt:
Aquí hay un extracto interesante:
Si esto es todo lo que le interesa, describí una forma de hacer que GAE y GWT-RPC trabajen juntos "de fábrica". Simplemente declare sus entidades como: @PersistenceCapable (identityType = IdentityType.APPLICATION, detachable = "false") public class MyPojo implementa Serializable {}
y todo funcionará, pero tendrá que lidiar manualmente con el reajuste al enviar objetos desde el cliente al servidor.
Puede usar esta opción y no necesitará una clase espejo (DTO). También puede probar gilead (former hibernate4gwt), que se ocupa de algunos detalles dentro de los problemas de serialización de objetos mejorados.
No tiene que crear dos versiones del modelo de dominio.
Aquí hay dos consejos:
Use una clave codificada en cadena, no la clase Clave de apéndice.
pojo = pm.detachCopy(pojo)
... eliminará todas las mejoras de JDO.
No tiene que crear instancias separadas, de hecho, es mejor que no lo haga. Sus objetos JDO deben ser POJO simples de todos modos, y nunca deben contener lógica comercial. Eso es para su capa de negocios, no sus propios objetos persistentes.
Todo lo que necesita hacer es incluir la fuente de las anotaciones que está utilizando y GWT debe compilar su clase sin problemas. Además, desea evitar el uso de bibliotecas que GWT no puede compilar (como cosas que usan el reflejo, etc.), pero en todos los proyectos que he hecho esto nunca ha sido un problema.
Tu evaluación es correcta JDO reemplaza las instancias de Colecciones con sus propias implementaciones, para poder oler cuándo cambia el gráfico del objeto, supongo. Estas implementaciones no son conocidas por el compilador GWT, por lo que no podrá serializarlas. Esto sucede a menudo para las clases que están compuestas de tipos compatibles con GWT, pero con anotaciones JDO, especialmente si algunas de las propiedades del objeto son Colecciones.
Para obtener una explicación detallada y una solución, echa un vistazo a este ensayo bastante influyente sobre el tema: http://timepedia.blogspot.com/2009/04/google-appengine-and-gwt-now-marriage.html