Я разрабатываю интерфейс 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 (GET on / rs / sample / 1), я получаю следующие данные:
{
"someString" : "somevalue1",
"nest2" : {
"someField" : "someothervalue"
}
}
это именно то, что я хочу.
Теперь возникает проблема: я пытаюсь отправить те же данные на ресурс / rs / sample / 1 через PUT.
Чтобы привязать данные json к объекту домена, контроллер, обрабатывающий запрос, вызывает 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