小编fro*_*row的帖子

将JSON绑定到嵌套的Grails域对象

我正在开发一个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)

data-binding grails json grails-orm

39
推荐指数
2
解决办法
6785
查看次数

标签 统计

data-binding ×1

grails ×1

grails-orm ×1

json ×1