Я разрабатываю интерфейс 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 указывает на объект SampleDomain с идентификатором 1
Когда я создаю ресурс с помощью моего настраиваемого json marshaller (GET on/rs/sample/1), я получаю следующие данные:
{
"someString" : "somevalue1",
"nest2" : {
"someField" : "someothervalue"
}
}
что именно то, что я хочу.
Теперь возникает проблема: я пытаюсь отправить те же данные в ресурс /rs/sample/ 1 через PUT.
Чтобы связать json-данные с объектом Domain, контроллер, обрабатывающий запрос, вызывает def domain = SampleDomain.get(id)
и domain.properties = data
, где данные являются немаршаллированным объектом.
Связывание для поля "someString" работает нормально, но вложенный объект не заполняется с помощью вложенных данных, поэтому я получаю сообщение об ошибке, что свойство "nest2" имеет значение null, что не разрешено.
Я уже пробовал реализовать пользовательский PropertyEditorSupport
, а также StructuredPropertyEditor
и зарегистрировать редактор для этого класса.
Странно, редактор вызывается только при поставке не-вложенных значений. Поэтому, когда я посылаю следующее на сервер через PUT (что не имеет никакого смысла;))
{
"someString" : "somevalue1",
"nest2" : "test"
}
по крайней мере вызывается редактор свойств.
Я посмотрел код GrailsDataBinder
. Я выяснил, что параметры настройки ассоциации, похоже, работают, указывая путь ассоциации вместо предоставления карты, поэтому также работает следующее:
{
"someString" : "somevalue1",
"nest2.somefield" : "someothervalue"
}
но это не помогает мне, так как я не хочу реализовывать собственный JavaScript для JSON-сериализатора объектов.
Можно ли использовать привязку данных Grails с помощью вложенных карт? Или действительно ли я реализую это вручную для каждого класса домена?
Большое спасибо,
Martin