2009-04-14 18 views
17

Vorrei sviluppare un'app Web che richiedesse la persistenza dei dati utilizzando GWT e GAE. A quanto ho capito, la mia unica opzione (o per lo meno la più comoda) per la persistenza dei dati è il Datastore di GAE, che usa oggetti annotati JDO o JPA. Mi piacerebbe anche essere in grado di inviare i miei oggetti avanti e indietro client-server tramite GWT Remote Procedure Calls (RPC), quindi i miei oggetti devono essere in grado di "staccare". Tuttavia, la serializzazione GWT RPC non può gestire oggetti JDO/JPA distaccati e non appare come se lo fosse nel prossimo futuro.Google Web Toolkit (GWT) + Google App Engine (GAE) + Persistenza dati separati

La mia domanda: qual è la soluzione più semplice e diretta a questo? Essere in grado di condividere gli stessi oggetti client/server con la persistenza lato server sarebbe estremamente conveniente.

EDIT

Vorrei chiarire che ancora desidero utilizzare GWT RPC con archivio dati di GAE. Sto solo cercando la soluzione migliore che consenta a tutte queste tecnologie di lavorare insieme.

+0

+1 per l'utilizzo di un servizio basato sul Web di cluster per la persistenza dei dati locali. :-) –

+1

Considereresti di condividere i tuoi progressi su questo dopo aver ricevuto le risposte qui? (e si prega di prendere in considerazione la scelta della migliore risposta) –

risposta

0

dal momento che GWT compila in definitiva su JavaScript, per la persistenza distaccata sarebbe necessario uno dei pochi servizi disponibili. i più noti sono gli archivi HTML5 e Gears (entrambi usano SQLite!). naturalmente, nessuno dei due è ampiamente implementato, quindi dovrai convincere i tuoi utenti a utilizzare un browser moderno o installare un plug-in poco conosciuto. essere sicuri di degradare a un sottoinsieme utilizzabile se l'utente non è conforme

+0

Separati stanno parlando di mandare in ibernazione ecc. Dtos avanzato non persistenza nel browser. –

+0

caso tipico di collisione termini. – Javier

3

Awhile fa ho scritto un post Using an ORM or plain SQL?

Ciò è avvenuto lo scorso anno in un GWT applicazione stavo scrivendo. Un sacco di traduzione da EclipseLink a oggetti di presentazione nell'implementazione del servizio . Se stessimo usando gli ibatis sarebbe stato molto più semplice per ibatis creare gli oggetti appropriati con e passare sopra e sotto lo stack . Alcuni puristi potrebbero obiettare che questo è Bad ™. Forse è così (nella teoria ) ma ti dico che: avrebbe portato a un codice più semplice, uno stack più semplice e una maggiore produttività.

che fondamentalmente corrisponde alla tua osservazione.

Ma ovviamente questa non è un'opzione con Google App Engine, quindi sei praticamente bloccato con un livello di traduzione tra oggetti lato client e le tue entità JPA.

Le entità JPA sono piuttosto rigide quindi non sono proprio appropriate per l'invio avanti e indietro tra il client in ogni caso. In genere, quando si fa questo, si vogliono piccoli bit da più entità (finendo così con una sorta di oggetto valore di livello di presentazione). Questa è la tua strada in avanti.

2

È possibile considerare l'utilizzo di JSON. GWT ha l'API necessaria per analizzare & generare una stringa JSON sul lato client. Ottieni molte API JSON per il lato server. Ho provato con google-gson, che va bene. Converte la stringa JSON in modello POJO e viceversa. Spero che questo aiuta a fornire una soluzione decente per il vostro requisito

7
+0

Più specificamente Adapter4AppEngine http://noon.gilead.free.fr/gilead/index.php?page=adapter4appengine Ricorda che non tutti i tipi di JDO di Google verranno serializzati. Testo, Blob e Utente, ad esempio. Avrai ancora bisogno di andare in giro in un altro modo. – Drew

5

Ray Cromwell ha un temporary hack up. L'ho provato e funziona.

Ti costringe a utilizzare Transient invece di entità rimovibili, perché GWT non può serializzare un oggetto nascosto [] utilizzato da DataNucleus; Ciò significa che gli oggetti inviati al client non possono essere reinseriti nell'archivio dati, è necessario recuperare l'oggetto datastore effettivo e copiare nuovamente tutti i campi persistenti. Il metodo di Ray utilizza il reflection per iterare sui metodi, recuperare i metodi getBean() e setBean() e applicare l'entità setBean() con getBean dell'oggetto() dell'oggetto transient gwt.

Si dovrebbe sforzarsi di utilizzare JDO, il JPA non è molto più di una classe wrapper per ora. Per usare questo hack, devi avere entrambi i metodi getter e setter per ogni campo persistente, usando la regola PROPER getBean e setBean per ogni campo "bean". Bene, quasi perfetto, poiché presuppone che tutti i getter inizieranno con "get", quando l'uso del campo booleano predefinito è "is".

Ho risolto questo problema e pubblicato un commento sul blog di Ray, ma è in attesa di approvazione e non sono sicuro che lo pubblicherà. Fondamentalmente, ho implementato un'annotazione @GetterPrefix (prefix = MethodPrefix.IS) nel pacchetto org.datanucleus per aumentare il suo lavoro.

Nel caso in cui non venga pubblicato, e questo è un problema, invia un'email a x_AT_aiyx_DOT_info Re: @GetterPrefix per JDO e ti invierò la correzione.

3

Try this. È un modulo per serializzare i tipi di core GAE e inviarli al client GWT.

2

Attualmente utilizzo il pattern DTO (DataTransferObject). Non necessariamente pulito e molto più caldaia, ma GAE richiede ancora una buona quantità di piastra di riscaldamento al momento. ;)

Ho un oggetto dominio mappato (solitamente) one-to-one con un DTO. Quando un client ha bisogno di informazioni sul dominio, un DAO (DataAccessObject) sotterra una rappresentazione DTO dell'oggetto Dominio e lo invia attraverso il filo. Quando un DTO ritorna, porto il DAO al DTO che aggiorna tutti gli Oggetti Dominio appropriati.

Non è pulito come passare gli oggetti del dominio direttamente attraverso il cavo, ma i limiti dell'implementazione JDO di GAE e del processo di serializzazione di GWT indicano che questo è il modo più pulito per gestirmi al momento.

0

Che dire direttamente utilizzando Datastore API per caricare/archiviare oggetti dominio POJO?

Dovrebbe essere paragonabile all'approccio DTO, ad es. che devi gestire manualmente tutti i campi (se non usi trucchi come l'automazione basata sulla riflessione) mentre dovrebbe darti più flessibilità e pieno accesso a tutte le funzionalità di Datastore.

5

Recentemente ho trovato Objectify, che è progettato per essere un sostituto per JDO. Non ha ancora molta esperienza con esso ma è più semplice da usare rispetto a JDO, sembra più leggero, e afferma di aggirare la necessità di DTO con GWT, anche se non ho ancora provato quella particolare funzionalità.

1

Ho usato anche Objectify e mi piace molto. Devi ancora ballare con metodi pre/postLoad per tradurre ad es. Testo a stringa e ritorno.

2

Credo che la risposta ufficiale di Google per questo è GWT 2.1 RequestFactory. Dato che stai usando GWT e GAE, ti suggerirei di attenersi al framework ufficiale di Google ... Ho un'app basata su GWT/GAE simile ed è quello che sto facendo.

A proposito, la creazione di RequestFactory è un po 'fastidiosa.L'attuale plug-in Eclipse non include tutti i barattoli ma sono riuscito a trovare l'aiuto di cui avevo bisogno, in Stackoverflow