Привязка JSON к вложенным объектам домена Grails

Я разрабатываю интерфейс 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 с использованием вложенных карт? Или мне действительно нужно реализовать это вручную для каждого класса домена?

Большое спасибо,

Мартин

39
задан Will Hartung 10 January 2012 в 14:52
поделиться