Grails JSON -Antwort von Modellen und Submodellen (einer zu vielen)
-
25-10-2019 - |
Frage
Ich bin sehr neu in Grails und ich hoffe, ich habe eine einfache Frage an Sie.
Ich habe ein Domainmodel und in diesem Modell befindet sich ein verwandtes Modell (Eins-zu-Many). Sagen wir Service und einen Dienst als 'n' Aufgaben. Ich wähle (über findAllby ()) zB 3 -Dienste aus und jeder Dienst hat zum Beispiel mindestens eine oder drei Aufgaben.
Nun meine Frage. ich nicht WOLLEN SIE RETORING "Render FoundServices als JSON". Grund: Ich möchte die Menschen auf der ganzen Welt nicht über meine Modelldefinition und einige "geheime" Eigenschaften informieren, die alle automatisch von der Datenbank zurückgegeben/ausgewählt werden. Ist das ein richtiger Gedanke oder ist es eine "zu viel und zu tiefe Sicherheit"-Gedanken?
Also habe ich versucht herauszufinden, wie ich relevante Daten zurückgeben kann, die ich auf ähnliche Weise benötige als diese Objekte.
Ich habe es versucht:
List<Service> servicesSelection = Service.findAllByCompany("someCompany")
ArrayList services = new ArrayList();
for (Service service: servicesSelection) {
ArrayList myService = new ArrayList()
myService .add(service.id)
myService .add(service.getServiceName())
for (Tasks task: service.tasks) {
ArrayList serviceTasks = new ArrayList()
serviceTasks.add(task.id)
serviceTasks.add(task.getTaskName())
myService.add(serviceTasks)
}
services.add(myService)
}
render services as JSON
1) Ist das zu viel "Überkopf"?
2) Glaubst du "OK macht keine Sache, gib das gesamte Domainmodel zurück (aus Suchergebnis)"
3) Wenn ich meine eigenen "Array-Listen" zusammenstelle
Vielen Dank!
Lösung
Es ist nicht zu viel Gemeinkosten, wenn Ihre Sicherheitsanforderungen vorschreiben, dass bestimmte Informationen nicht weitergegeben werden. In den meisten Fällen denke ich nicht, dass es ein Problem ist, das gesamte Domain -Objekt in JSON zu konvertieren, aber Ihre App könnte ein Sonderfall sein.
Sie können den Code auf eine Weise schreiben, die mit der Groovy/Grails -Praxis übereinstimmt:
def services = []
for (s in Service.findAllByCompany("someCompany")) {
def tasks = []
for (t in s.tasks) {
tasks << [id: t.id, taskName: t.taskName]
}
def service = [id: s.id, serviceName: s.serviceName, tasks: tasks]
services << service
}
render services as JSON
Mir ist gerade aufgefallen, dass Ihr Code auch keine Schlüssel für die IDs und Namen bereitstellte (mit Listen anstelle von Karten), was wahrscheinlich etwas ist, das Sie tun möchten und welcher Beispielcode, den ich geschrieben habe.