Я разрабатываю интерфейс RESTful, который используется для предоставления данных JSON для приложения JavaScript.
На стороне сервера я использую Grails 1.3.7 и объекты домена GORM для сохранения. Я реализовал собственный JSON Marshaller для поддержки маршалинга вложенных объектов домена
Вот примеры объектов домена:
class SampleDomain {
static mapping = { nest2 cascade: 'all' }
String someString
SampleDomainNested nest2
}
и
class SampleDomainNested {
String someField
}
Ресурс SampleDomain публикуется по URL-адресу / rs / sample / so / rs / sample / 1 points в объект SampleDomain с идентификатором 1
Когда я визуализирую ресурс с помощью моего настраиваемого json-маршаллера (GET on / rs / sample / 1), я получаю следующие данные:
{
"someString" : "somevalue1",
"nest2" : {
"someField" : "someothervalue"
}
}
именно то, что мне нужно.
Теперь возникает проблема: я пытаюсь отправить те же данные на ресурс / rs / sample / 1 через PUT.
Чтобы привязать данные json к объекту домена, контроллер, обрабатывающий запрос, вызывает def domain = SampleDomain.get (id)
и domain.properties = data
, где data - это немаршалированный объект.
Привязка для поля someString работает нормально, но вложенный объект не заполняется вложенными данными, поэтому я получаю сообщение об ошибке, что свойство «nest2» имеет значение null, что недопустимо.
Я уже пробовал реализовать собственный PropertyEditorSupport
, а также StructuredPropertyEditor
и зарегистрировать редактор для класса.
Как ни странно, редактор вызывается только тогда, когда я предоставляю не вложенные значения. Поэтому, когда я отправляю следующее на сервер через PUT (что не имеет никакого смысла;))
{
"someString" : "somevalue1",
"nest2" : "test"
}
, по крайней мере, вызывается редактор свойств.
Я просмотрел код GrailsDataBinder
. Я обнаружил, что установка свойств ассоциации, похоже, работает путем указания пути ассоциации вместо предоставления карты, поэтому также работает следующее:
{
"someString" : "somevalue1",
"nest2.somefield" : "someothervalue"
}
но это мне не помогает, так как я не хочу реализовывать пользовательский сериализатор объектов JavaScript в JSON.
Можно ли использовать привязку данных Grails с использованием вложенных карт? Или мне действительно нужно реализовать это вручную для каждого класса домена?
Большое спасибо,
Мартин