我正在开发一个用于为JavaScript应用程序提供JSON数据的RESTful接口。将JSON绑定到嵌套的Grails域对象
在服务器端,我使用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 /样品下发布/ so/rs/sample/1指向ID为1的SampleDomain对象
当我使用自定义json编组器呈现资源时(GET on/rs/sample/1),我得到以下数据:
{
"someString" : "somevalue1",
"nest2" : {
"someField" : "someothervalue"
}
}
这正是我想要的。
现在出现这个问题:我尝试通过PUT将相同的数据发送到resource/rs/sample/1。
将JSON数据绑定到域对象,控制器处理请求调用def domain = SampleDomain.get(id)
和domain.properties = data
其中数据是已解组对象。
“someString”字段的绑定工作得很好,但嵌套对象没有使用嵌套数据填充,所以我得到一个错误,即属性“nest2”为null,这是不允许的。
我已经尝试过实现自定义PropertyEditorSupport
以及StructuredPropertyEditor
并注册该类的编辑器。
奇怪的是,编辑器只在我提供非嵌套值时被调用。所以,当我把下面通过把服务器(其中没有任何意义;))
{
"someString" : "somevalue1",
"nest2" : "test"
}
至少属性编辑器被调用。我看了GrailsDataBinder
的代码。我发现,设置的关联性似乎通过指定的关联路径,而不是提供地图,所以下面的工作以及工作:
{
"someString" : "somevalue1",
"nest2.somefield" : "someothervalue"
}
,但这并不能帮助我,因为我不您想要实现一个自定义JavaScript到JSON对象序列化器。
是否可以使用嵌套地图使用Grails数据绑定?或者我真的很想为每个领域类手动实现?
非常感谢,
马丁
你有一个自定义的json unmarshaller吗? – fixitagain
不,我没有自定义json unmarshaller。我通过使用request.JSON解析请求。我想要的是一个属性编辑器,它既支持从Map创建域对象,也支持通过ID加载/映射域对象。 – frow
你试过这个插件:http://www.grails.org/plugin/json-rest-api –