Grails:如何以编程方式将命令对象数据绑定到服务中的域对象?
Grails: how to programatically bind command object data to domain object in service?
我有一个要转换为域对象的命令对象。
但是,我想将命令对象转换成的对象可能是两个域之一类(它们都是派生的类),我需要在一个服务中完成(这是我根据其他数据决定它应该绑定到哪种类型的对象的地方)。这可能吗?最好的方法是什么? bindData()
仅存在于控制器中。
我是否只需要手动将命令对象参数映射到适当的域对象属性?或者有 faster/better 方法吗?
如果参数有相同的名称,那么您可以使用this question复制值。快速总结如下。
使用 Grails API
您可以通过访问 class 中的 properties
字段来循环浏览 class 中的属性。
object.properties.each { property ->
// Do something
}
然后您可以检查 属性 是否存在于另一个对象中。
if(otherObject.hasProperty(property) && !(key in ['class', 'metaClass']))
然后您可以将它从一个对象复制到另一个对象。
使用 Commons
Spring 有一个非常好的实用程序 class,叫做 BeanUtils
,它提供了一个通用的复制方法,这意味着您可以做一个简单的单行。
BeanUtils.copyProperties(object, otherObject);
这将在名称相同的地方复制值。您可以查看文档 here.
否则..
如果它们之间没有映射,那么你会有点卡住,因为引擎不知道如何比较它们,所以你需要手动进行。
我有一个要转换为域对象的命令对象。
但是,我想将命令对象转换成的对象可能是两个域之一类(它们都是派生的类),我需要在一个服务中完成(这是我根据其他数据决定它应该绑定到哪种类型的对象的地方)。这可能吗?最好的方法是什么? bindData()
仅存在于控制器中。
我是否只需要手动将命令对象参数映射到适当的域对象属性?或者有 faster/better 方法吗?
如果参数有相同的名称,那么您可以使用this question复制值。快速总结如下。
使用 Grails API
您可以通过访问 class 中的 properties
字段来循环浏览 class 中的属性。
object.properties.each { property ->
// Do something
}
然后您可以检查 属性 是否存在于另一个对象中。
if(otherObject.hasProperty(property) && !(key in ['class', 'metaClass']))
然后您可以将它从一个对象复制到另一个对象。
使用 Commons
Spring 有一个非常好的实用程序 class,叫做 BeanUtils
,它提供了一个通用的复制方法,这意味着您可以做一个简单的单行。
BeanUtils.copyProperties(object, otherObject);
这将在名称相同的地方复制值。您可以查看文档 here.
否则..
如果它们之间没有映射,那么你会有点卡住,因为引擎不知道如何比较它们,所以你需要手动进行。