È questo un valido utilizzo di transitori Grails?
-
23-09-2019 - |
Domanda
Ho un oggetto di dominio su cui voglio conservare un paio di cose che esistono solo in fase di esecuzione. Ho guardato il e ho trovato la parola chiave transients
, che , sulla faccia di esso era quello che stavo cercando. Ecco ciò che il mio oggetto di dominio sembra ...
class Contact {
def Seeker
def beforeInsert()
{
initiatedDate = new Date()
}
Date initiatedDate
Date acceptedDate
static transients = ['pal']
Seeker pal
}
dove Seeker
è una classe Groovy, che non è un oggetto di dominio, ma un segnaposto per alcune proprietà.
Finora tutto va bene e la mia tabella di contatto non dispone di un campo pal
come previsto. Nel mio ContactController
interrogo per un gruppo di contatti, c
, poi cercare i loro amici Seeker
(dettagli su come trattenuta) e impostare il campo pal
a un nuovo oggetto.
c.pal = new Seeker();
c.pal.name = otherObject.name
render c as JSON
Questo sembra tutto funzionare bene, tranne che l'oggetto PAL non è presente nel JSON restituito.
È questo un valido utilizzo di transitori? La documentazione parlare che sono a portata di mano per i getter e setter basati su funzioni, ma nel mio caso voglio un oggetto reale. Dovrei essere a scrivere un metodo getPal () e setPal () sul mio oggetto?
Grazie
Soluzione
I transitori sono infatti utilizzati per smettere di campi in oggetti di dominio di essere persistente. (Se si desidera eseguire alcune init sul campo amico, senza dover mettere in vostro controller è possibile utilizzare l'evento onLoad () o scrivere un metodo getPal (), che sarebbe ignorare il getter proprietà predefinita). Lei è anche giusto notare che la marshaller JSON predefinita rende solo campi persistenti.
Quando il rendering i miei oggetti di dominio che ho trovato utile per creare marshaller oggetto JSON in modo che le proprietà indesiderate non sono resi, ma sarebbe anche risolvere il tuo problema temporaneo troppo. È possibile farlo utilizzando il metodo JSON.registerObjectMarshaller:
import grails.converters.JSON
...
class BootStrap {
def init = {servletContext ->
JSON.registerObjectMarshaller(Contact ) {
def returnArray = [:]
returnArray['id'] = it.id
returnArray['initiatedDate'] = it.initiatedDate
returnArray['acceptedDate'] = it.acceptedDate
returnArray['pal'] = it.pal
return returnArray
}
JSON.registerObjectMarshaller(Seeker) {
...
}
Se si aggiungono i marshaller nel BootStrap.groovy saranno disponibili nei tuoi controller.
HTH
(che si trova anche questo: http: // old.nabble.com/Taggable-plugin-and-JSON-converter-ts24830987.html#a24832970 )