Grails:如何以编程方式将命令对象数据绑定到服务中的域对象?

Joh*_*ohn 3 data-binding grails grails-orm

我有一个命令对象,我想转换为域对象.

但是,我想将命令对象转换为的对象可能是两个域类之一(它们都是派生类),我需要在服务中执行它(根据其他数据,我决定哪个应该绑定的对象类型).这是可能的,这是最好的方法吗? bindData()仅存在于控制器中.

我是否只需手动将命令对象参数映射到适当的域对象属性?还是有更快/更好的方式?

chr*_*her 6

如果参数具有相同的名称,则可以使用此问题复制值.快速摘要如下.

使用Grails API

您可以通过访问类中的properties字段来遍历类中的属性.

object.properties.each { property -> 
    // Do something
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以检查该属性是否存在于另一个对象中.

if(otherObject.hasProperty(property) && !(key in ['class', 'metaClass']))
Run Code Online (Sandbox Code Playgroud)

然后,您可以将其从一个对象复制到另一个对象.

使用Commons

Spring有一个非常好的实用程序类BeanUtils,它提供了一个通用的复制方法,这意味着你可以做一个简单的oneliner.

BeanUtils.copyProperties(object, otherObject);
Run Code Online (Sandbox Code Playgroud)

这会将值复制到名称相同的位置.你可以在这里查看文档.

除此以外..

如果它们之间没有映射,那么你就会陷入困境,因为引擎根本不知道如何比较它们,所以你需要手动完成它.