2014-01-07 9 views
6

Ich habe eine Domain-Klasse Person in meinem Grails-Anwendung, die ich in verschiedenen Formen (JSON) abhängig von dem Kontext ausgeben muss.Grails - Wie registriere ich einen bereits registrierten Objekt Marshaller

In einem Kontext muss ich nur ein paar Felder (sagen ID und Name) rendern. In einem anderen Zusammenhang möchte ich noch viel mehr rendern (ID, Name, Anmeldeinformationen, Alter usw.). Ich frage mich, ob es möglich ist, einen bestimmten Marshaller direkt nach dem Gebrauch abzumelden.

Wesentlichen, was ich suche, ist so etwas wie:

------------------------------------------------------------- 

// context #1 
JSON.registerObjectMarshaller(Person) { 
    ... output just id and name 
} 

render myPerson as JSON 

JSON.unregisterObjectMarshaller(Person) // how do i do this? 

------------------------------------------------------------- 

// context #2 
JSON.registerObjectMarshaller(Person) { 
    ... output all fields 
} 

render myPerson as JSON 

JSON.unregisterObjectMarshaller(Person) // how do i do this? 

------------------------------------------------------------- 

Hinweis: I 2 leer Subklassen für Person erstellen können und dann getrennt Einweiser für jede registriert. Als Anzahl der Kontexte erhöhen Sie auch die Anzahl der Dummy-Unterklassen. Das ist sehr unsauber.

Antwort

17

Sie möchten wahrscheinlich eine so genannte benannte Konfiguration anstelle von "swaps" Marshaller verwenden. Sie können diese einpacken in eine sauberere Klasse/Dienstprogramm, aber irgendwo (wie Bootstrap.groovy) tun:

JSON.createNamedConfig('thin') { 
    it.registerObjectMarshaller(Person) { Person person -> 
     return [ 
      id: person.id, 
      name: person.name, 
     ] 
    } 
} 

JSON.createNamedConfig('full') { 
    it.registerObjectMarshaller(Person) { Person person -> 
     return [ 
       id: person.id, 
       name: person.name, 
       age: person.age 
     ] 
    } 
} 

Dann wird in einem Controller, können Sie wählen, welche Art von vermarshallten Person zu zeigen:

// Show lots of stuff 
JSON.use('full') { 
    render people as JSON 
} 

oder

// Show less stuff 
JSON.use('thin') { 
    render people as JSON 
} 
+1

+1 Das ist schön. Und sehr sauber. Vielen Dank. Ich lege es rein und lasse Sie wissen, wie es gelaufen ist. – techfoobar

+0

Hat super funktioniert. Vielen Dank. :) – techfoobar

+0

Froh, dass es geklappt hat, habe einen guten. –

Verwandte Themen