我目前正在创建一些域类的审核,并创建了一个AuditingListener
来调用ServiceMethod来保存旧数据。
在本服务方法中,我通过一些命名约定获得域类的审计类。
一切正常,但现在我正在处理审计类的问题。 审计类从基本域类扩展,如下所示:
class Foo {
String baaar
}
class FooAudit extends Foo {
Long auditId
Date auditDate = new Date()
}
我的问题是,我希望FooAudit
保留Foo
的ID,并拥有自己的ID属性。
在将创建审计条目的服务方法中,我获取原始域类对象的所有属性的映射。
我想在此地图中设置FooAudit
的属性,但地图还包含id
的{{1}}属性。
如果我按地图设置属性,如
Fooo
这会将def auditEntry = new FooAudit()
auditEntry.properties = map
的标识设置为与FooAudit
相同,但我想拥有Foo
如何将属性FooAudit
设置为auditId
的标识符?
答案 0 :(得分:1)
作为一个例子,对于使用特殊情况复制属性的情况,我有一个带有静态方法的类,如下所示(也许它很有用......你可以按照自己喜欢的方式处理id。 ..)
static def fillObjectProperties(def map, def obj, def excludeArray, def typeConvMap) {
map.each {
if (obj.hasProperty(it.key) && !excludeArray.contains(it.key)) {
try {
if (it.value == null || it.value.size() == 0) {
obj.setProperty(it.key, null)
}
else if (typeConvMap.containsKey(it.key)) {
if (typeConvMap[it.key] == 'int') {
obj.setProperty(it.key, it.value as int)
} else if (typeConvMap[it.key] == 'BigDecimal') {
obj.setProperty(it.key, it.value as BigDecimal)
} else if (typeConvMap[it.key] == 'Date') {
Date date = new Date()
date.clearTime()
date.set(date: map[it.key + '_day'] as int, month: (map[it.key + '_month'] as int) -1, year: map[it.key + '_year'] as int)
obj.setProperty(it.key, date)
}
} else {
obj.setProperty(it.key, it.value)
}
} catch(Exception ex) {}
}
}
}
static def copyObjectProperties(def source, def target) {
target.metaClass.properties.each{
if (it.name != 'metaClass') {
it.setProperty(target, source.metaClass.getProperty(source, it.name))
}
}
return source
}
答案 1 :(得分:0)
也许你可以创建一个可以容纳所有必要属性的基类?
class FooBase{
String baaar
}
class Foo extends FooBase{
}
class FooAudit extends FooBase {
Long auditId
Date auditDate = new Date()
}