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
}

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

Était-ce utile?

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 )

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top