2013-10-02 16 views
24

Mam dwie klasy domeny, z których jedna jest nadrzędna, a druga to dziecko, a ja mam między nimi bardzo wiele relacji. Klasa nadrzędna ma wiele klas potomnych i potomnych należących do klasy nadrzędnej. A oto przykład kodu.Grails pobiera obiekty domeny podrzędnej

class Parent{ 
    String name 
    static hasMany = [childs:Child] 
    static constraints = { 
    } 
} 


class Child{ 
    String name 
    static belongsTo = [parent:Parent] 
    static constraints={} 
} 

Problem pojawia się, gdy tylko otrzymam obiekt nadrzędny, zostaną również pobrane obiekty podrzędne powiązane z klasą nadrzędną. Ale kiedy przekonwertuję obiekt na JSON, nie widzę obiektu potomnego w całości, mogę tylko zobaczyć identyfikatory obiektów podrzędnych. Chcę zobaczyć wszystkie kolumny obiektu podrzędnego zamiast tylko Id.

Budynek odpowiedź JSON:

[{"class":"project.Parent","id":1, 
    "name":"name1","childs":[{"class":"Child","id":1},{"class":"Review","id":2}]}] 

Ale chcę odpowiedzi, która zawiera nazwę obiektu podrzędnego też następująco

[{"class":"project.Parent","id":1,"name":"name1", 
    "childs":[{"class":"Child","id":1,"name":"childname1"}, 
      {"class":"Review","id":2,"name":"childname2"} 
      ] 
}] 

Każda pomoc mile widziana. Z góry dzięki.

Odpowiedz

48

Problem dotyczy użycia domyślnego konwertera JSON. Oto twoje opcje:

1. Default - all fields, shallow associations 
    a. render blah as JSON 

2. Global deep converter - change all JSON converters to use deep association traversal 
    a. grails.converters.json.default.deep = true 

3. Named config marshaller using provided or custom converters 
    a. JSON.createNamedConfig('deep'){ 
     it.registerObjectMarshaller(new DeepDomainClassMarshaller(...)) 
    } 
    b. JSON.use('deep'){ 
     render blah as JSON 
    } 

4. Custom Class specific closure marshaller 
    a. JSON.registerObjectMarshaller(MyClass){ return map of properties} 
    b. render myClassInstance as JSON 

5. Custom controller based closure to generate a map of properties 
    a. convert(object){ 
     return map of properties 
    } 
    b. render convert(blah) as JSON 

Obecnie używasz opcji 1, która jest domyślna.

Najprościej można zrobić, używając opcji 2, aby ustawić globalny głęboki konwerter, ale należy pamiętać, że powoduje to WSZYSTKIE klasy domen w aplikacji. Co oznacza, że ​​jeśli masz duże drzewo skojarzeń zakończone obiektem najwyższego poziomu i spróbujesz przekonwertować listę obiektów najwyższego poziomu, to konwerter głębokie wykona wszystkie zapytania, aby pobrać wszystkie powiązane obiekty i powiązane z nimi obiekty. skręcać. - Możesz załadować całą bazę danych w jednym ujęciu :) Bądź ostrożny.

+0

Hej Dzięki użyłem 3-cia metody JSON.use ('DEAP') {renderowanie Parent jako JSON} to po prostu działało jak się spodziewałem. – user2823355

+0

dziękuję bardzo! to rozwiąże wiele problemów <3 – Mephiztopheles

+0

Jesteś bardzo mile widziany, szczęśliwe kodowanie. – dbrin

3

Najnowsze grails automatycznie głęboko się konwertują, ale prawdopodobnie jesteś ofiarą leniwego ładowania.

Dzieci nie są ładowane przy dostępie, a zatem konwerter JSON nie może ich przekonwertować na JSON. Rozwiązaniem jest umieścić ten

statyczne odwzorowania = {Childs leniwych: false}