Frage

Ich habe ein Domain-Objekt, auf das ich ein paar Dinge gespeichert werden soll, die erst zur Laufzeit existieren. Ich schaute auf der Dokumentation und das transients Schlüsselwort gefunden, die , auf dem Gesicht von ihm war, was ich suchte. Hier ist, was meine Domain-Objekt sieht aus wie ...

class Contact {

    def Seeker

    def beforeInsert() 
    {
       initiatedDate = new Date()
    }

    Date initiatedDate
    Date acceptedDate

    static transients = ['pal']
    Seeker pal
}

Dabei gilt Seeker eine groovige Klasse ist, die kein Domänenobjekt ist, sondern ein Platzhalter für einige Eigenschaften.

So weit ist alles in Ordnung und mein Kontakt Tabelle nicht über ein pal Feld wie erwartet. In meiner ContactController ich Abfrage für eine Reihe von Kontakten, c, dann sehen ihre Seeker Kumpel (Einzelheiten, wie zurückgehalten) und stellen Sie das pal Feld auf ein neues Objekt.

c.pal = new Seeker();
c.pal.name = otherObject.name
render c as JSON

Das alles scheint zu funktionieren, außer dass das pal-Objekt aus der JSON zurückgegeben fehlt.

Ist dies eine gültige Verwendung von Transienten? Die docs erwähnen, dass sie für funktionsbasierte Getter und Setter sind praktisch, aber in meinem Fall möchte ich ein tatsächliches Objekt. Soll ich einen getPal sein Schreiben () und setPal () -Methode auf meinem Objekt?

Danke

War es hilfreich?

Lösung

Transienten werden in der Tat zu stoppen Felder in Domänenobjekten verwendet von beharrte werden. (Wenn Sie einige init auf dem pal Feld auszuführen, ohne es in Ihrem Controller zu setzen, die könnten Sie die onLoad () Ereignis verwenden oder einen getPal () -Methode schreiben, die die Standard-Eigenschaft Getter außer Kraft setzen würden). Sie sind auch Recht zu beachten, dass der Standard-JSON Einweiser nur Felder beharrte rendert.

Wenn meine Domain-Rendering-Objekte die ich gefunden habe es nützlich JSON-Objekt Einweiser zu schaffen, so dass unerwünschte Eigenschaften nicht erbracht werden, aber es wäre auch zu Ihrem vorübergehenden Problem lösen. Sie können diese mit der JSON.registerObjectMarshaller Methode tun:

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) {
            ...
        }

Wenn Sie die Einweiser in Ihrem BootStrap.groovy hinzufügen, werden sie in Ihrem Controller zur Verfügung.

HTH

(fanden auch diese: http: // old.nabble.com/Taggable-plugin-and-JSON-converter-ts24830987.html#a24832970 )

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top