我正在开发一个RESTful接口,用于为JavaScript应用程序提供JSON数据.
在服务器端,我使用Grails 1.3.7并使用GORM域对象进行持久化.我实现了一个自定义JSON Marshaller来支持编组嵌套域对象
以下是示例域对象:
class SampleDomain {
static mapping = { nest2 cascade: 'all' }
String someString
SampleDomainNested nest2
}
Run Code Online (Sandbox Code Playgroud)
和
class SampleDomainNested {
String someField
}
Run Code Online (Sandbox Code Playgroud)
SampleDomain资源在URL/rs/sample/so/rs/sample/1下发布,指向ID为1的SampleDomain对象
当我使用自定义json marshaller(/ rs/sample/1上的GET)渲染资源时,我得到以下数据:
{
"someString" : "somevalue1",
"nest2" : {
"someField" : "someothervalue"
}
}
Run Code Online (Sandbox Code Playgroud)
这正是我想要的.
现在出现了问题:我尝试通过PUT将相同的数据发送到资源/ rs/sample/1.
要将json数据绑定到域对象,处理请求的控制器调用def domain = SampleDomain.get(id)以及domain.properties = data数据是unmarshalled对象的位置.
"someString"字段的绑定工作得很好,但是嵌套对象没有使用嵌套数据填充,因此我得到一个错误,即属性"nest2"为null,这是不允许的.
我已经尝试过实现一个自定义PropertyEditorSupport以及一个StructuredPropertyEditor并为该类注册编辑器.
奇怪的是,当我提供非嵌套值时,编辑器才会被调用.所以当我通过PUT将以下内容发送到服务器时(这没有任何意义;))
{
"someString" : "somevalue1",
"nest2" : "test"
}
Run Code Online (Sandbox Code Playgroud)
至少会调用属性编辑器.
我查看了代码GrailsDataBinder.我发现通过指定关联的路径而不是提供地图,设置关联的属性似乎有效,因此以下工作原理:
{
"someString" : "somevalue1", …Run Code Online (Sandbox Code Playgroud)