2017-05-26 4 views
0

Ich arbeite mit Gson und Web-Profil.Grails 3 Profile, JSON-Rendering und One to Many mit Selbst

Meine Domain ist:

package json 
import grails.rest.* 

@Resource(readOnly = false, formats = ['json', 'xml']) 
class Hero { 
    String name 
    String data 
    String relation 
    Book book 
    static hasMany = [children: Hero] 

Mein Controller ist:

package json 

import grails.rest.* 
import grails.converters.* 

class HeroController extends RestfulController { 
    static responseFormats = ['json', 'xml'] 
    HeroController() { 
     super(Hero) 
    } 
    def show(Hero hero){ 
     respond hero 
    } 
} 

Mein Gson:

hero.gson

import json.Hero 

model { 
    Hero hero 
} 

json tmpl.hero(hero) 

_hero.gson

import json.Hero 

model { 
    Hero hero 
} 

json { 
    //data hero.data 
    id hero.id 
    data(relation: hero.relation) 
    name hero.name 
    children g.render(hero.children) 
} 

Wenn ich es mit geruhsamem Profil dann die alle Kinder Knoten korrekt gerendert werden ausgeführt. Wenn ich Webprofil verwende, werden nur zwei Ebenen tief gerendert.

Mein erwartetes Ergebnis ist:

{ 
    "id": 4, 
    "data": { 
     "relation": "e" 
    }, 
    "name": "e", 
    "children": [{ 
      "id": 2, 
      "data": { 
       "relation": "c" 
      }, 
      "name": "c", 
      "children": [{ 
        "id": 1, 
        "data": { 
         "relation": "b" 
        }, 
        "name": "b", 
        "children": [] 
       } 
      ] 
     } 

Ist es möglich, ein zu vielen json zu tun zu machen (wie mit dem geruhsamen Profil)? Gibt es eine Möglichkeit, die Tiefe des Renderings zu steuern?

P.S. Ich las die Dokumentation und dieser Teil ist nicht sehr clearfor mich:

Wenn Sie für den Autor wollen als Teil des Rendering einbezogen werden, es zwei Anforderungen sind, müssen Sie zuerst die Verbindung sicher initialisiert .

Wenn die Rendermethode auf einen Proxy trifft, wird sie nicht in die -Beziehung verschoben, um N + 1-Abfrage-Leistungsprobleme zu vermeiden. Dieselbe gilt für Eins-zu-Viele-Auflistungsverknüpfungen. Wenn die Verknüpfung nicht initialisiert wurde, wird die Rendermethode nicht durch die Auflistung durchlaufen!

So müssen Sie Ihre Anfrage stellen Sie sicher, verwendet eine beitreten:

Book.findByTitle ("The Stand", [holen: [Autor: "Join"]])

Zweitens, wenn die Methode machen Aufruf Sie sollten die tiefe Argument übergeben:

json g.render (Buch, [tief: true])

Antwort

1

ja, es ist möglich, Ihre json mit Web-Profil zu machen. Ich kann es tun, indem ich hinzufüge, um zu bauen.gradle:

apply plugin:"org.grails.plugins.views-json" 

dependencies { 

    compile "org.grails.plugins:views-json" 
    compile "org.grails.plugins:views-json-templates" 



bootRun { 
    jvmArgs('-Dspring.output.ansi.enabled=always') 
    addResources = true 
} 

und mit Ihrem Code mit einer kleinen Änderung in der Domain-Klasse: Kinder faul: false

@Resource(readOnly = false, formats = ['json', 'xml']) 
class Hero { 
    String name 
    String data 
    String relation 
    //Book book 
    static hasMany = [children: Hero] 

    static mapping = { 
     children lazy: false 
    } 

, die den Modus holen wird sich ändern. können Sie beraten über hier holen:

enter link description herehttp://docs.grails.org/3.1.1/ref/Database%20Mapping/fetch.html

http://docs.grails.org/3.1.1/guide/single.html#fetching

+0

es scheint, dass ich ältere Version hinzugefügt haben: Classpath „org.grails.plugins: views-gradle. 1.1 * ... –