Est-ce une utilisation valable des transitoires Grails?
-
23-09-2019 - |
Question
J'ai un objet de domaine sur lequel je veux stocker quelques petites choses qui existent uniquement lors de l'exécution. Je regardais la de et a trouvé le mot-clé transients
, qui , sur le visage de c'était ce que je cherchais. Voici ce que mon objet de domaine ressemble à ...
class Contact {
def Seeker
def beforeInsert()
{
initiatedDate = new Date()
}
Date initiatedDate
Date acceptedDate
static transients = ['pal']
Seeker pal
}
où Seeker
est une classe groovy qui n'est pas un objet de domaine, mais un espace réservé pour certaines propriétés.
Jusqu'à présent, tout va bien et ma table de contact n'a pas un champ de pal
comme prévu. Dans mon ContactController
je requête pour un groupe de contacts, c
, puis regarder leurs copains Seeker
(détails de la façon dont retenu) et définissez le champ pal
à un nouvel objet.
c.pal = new Seeker();
c.pal.name = otherObject.name
render c as JSON
Cela semble tout sauf travailler bien que l'objet pal est absent du JSON retourné.
Est-ce une utilisation valable de transitoires? Les documents mentionnent qu'ils sont à portée de main pour getters basés sur des fonctions et setters, mais dans mon cas je veux un objet réel. Dois-je écrire une méthode getPal () et setPal () sur mon objet?
Merci
La solution
Transients sont en effet utilisés pour arrêter les champs dans des objets de domaine d'être maintenue. (Si vous voulez effectuer une initialisation sur le champ pal sans avoir à mettre dans votre contrôleur, vous pouvez utiliser l'événement ou écrire une méthode getPal () onLoad () qui l'emporterait sur le getter de propriété par défaut). Vous avez également raison de noter que la valeur par défaut JSON placier ne fait que rendre les champs persistaient.
Lors du rendu mes objets de domaine que je l'ai trouvé utile de créer marshallers objet JSON afin que les propriétés non désirées ne sont pas rendus, mais il serait aussi résoudre votre problème transitoire aussi. Vous pouvez le faire en utilisant la méthode 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) {
...
}
Si vous ajoutez les placiers dans votre BootStrap.groovy ils seront disponibles dans vos contrôleurs.
HTH
(également ceci: http: // old.nabble.com/Taggable-plugin-and-JSON-converter-ts24830987.html#a24832970 )