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])
es scheint, dass ich ältere Version hinzugefügt haben: Classpath „org.grails.plugins: views-gradle. 1.1 * ... –