2015-01-15 41 views
1

我最近从2.1.0升级项目中的Grails 2.4.4Grails的bindData不升级后嵌套对象相匹配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

同样重要的是向我们展示图书的看法了。 – dsharew

回答

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) 
+0

如果我不能以旧的方式运作,这是一个潜在的解决方法。谢谢。 –