升级到2.4.4后,Grails bindData与嵌套对象不匹配

时间:2015-01-15 23:07:24

标签: json grails

我最近将项目从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 } } 

这种格式更有意义,但不幸的是,它首先没有以这种方式构建。

1 个答案:

答案 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)