Grails json Реакция моделей и подмоделей (один ко многим)
-
25-10-2019 - |
Вопрос
Я очень новичок в Grails, и я надеюсь, что у меня будет легкий вопрос для вас.
У меня есть Domainmodel, и внутри этой модели есть связанная модель (один-один). Допустим, сервис и сервис в качестве задач. Я выбираю (через findallby ()), например, 3 службы, и, например, у каждой службы есть хотя бы одна задача или три.
Теперь мой вопрос. я не Хочу вернуть "рендеринг -заседание как JSON". Причина: я не хочу, чтобы люди во всем мире знали определение моей модели и некоторые, возможно, «секретные» свойства, которые все заполняются автоматически возвратом/выбором базы данных. Это правильная мысль, или это «слишком много и слишком глубокая безопасность»-размышления?
Поэтому я попытался выяснить, как я могу вернуть соответствующие данные, которые мне нужны в аналогичном образом, чем эти объекты.
Я старался:
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) Это слишком много "накладных расходов"?
2) Как вы думаете, «ОК, не имеет значения, верните всю доменмодель (из результатов поиска)»
3) Если я собираю свои собственные «списки массивов» вместе, как это можно сделать, чтобы быть похожим на доменные модели, чтобы легко получить доступ к всем свойствам и списку «N» в каждой службе
Большое спасибо!
Решение
Это не слишком много накладных расходов, если ваши требования безопасности определяют, что определенная информация не будет передана. В большинстве случаев я не думаю, что это проблема просто преобразовать весь объект домена в JSON, но ваше приложение может быть особым случаем.
Вы можете написать код, чтобы сделать это таким образом, более соответствующего практике Groovy/Grails:
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
Я только что заметил, что ваш код также не предоставил ключи для идентификаторов и имен (используя списки вместо карт), что, вероятно, вы хотели бы сделать, и что делает пример, который я написал.