我最近将项目从2.1.0升级到Grails 2.4.4
在各种地方,我们使用bindData将传入的JSON映射到域对象,包括嵌套对象。升级或符号更改后,这似乎不起作用。
例如
Class Book {
Author author
...
}
传入JSON
{ "author.id" : 7 }
并致电
def book = new Book()
bindData(book, request.JSON, [include: ['author']])
以前会找到作者7并将他附加到示例书中。现在它并没有绑定任何东西。还有其他人遇到过这个问题还是类似的东西?
由于
编辑:
更新传入的JSON可以解决此问题并且可能会解决此问题:
{ "author" : { "id" : 7 } }
这种格式更有意义,但不幸的是,它首先没有以这种方式构建。
答案 0 :(得分:1)
这可能会对你有所帮助 出于某种原因,我无法使用默认数据绑定器,所以我想出了这个自定义数据绑定器 。
Object bindDataCustom (Object targetObject, Map sourceObject) { //named bindDataCustom so it cant confuse with bindData
sourceObject.each{ property, value->
if(property.toString().contains(".")){
String[] nestedProperty = property.toString().split("\\."); //e.g split author.id to author and id
String subObjectName = nestedProperty[0][0].toUpperCase() + nestedProperty[0].substring(1)
String subObjectPropertyName = nestedProperty[1]
Object subObject = Class.forName(packageName + subObjectName, true, Thread.currentThread().getContextClassLoader())."findBy${subObjectPropertyName[0].toUpperCase()}${subObjectPropertyName.substring(1)}"(value)
targetObject."${nestedProperty[0]}" = subObject
}else{
DataBindingUtils.bindObjectToInstance(targetObject, sourceObject, [property], [], null)
}
}
return targetObject;
}
现在你可以这样做:
def book = new Book()
bindDataCustom(book, request.JSON)