我当前正在创建一些域类的审核,并创建了一个AuditingListener
来调用ServiceMethod来保存旧数据。
在此服务方法中,我通过一些命名约定来获取域类的审核类。
一切正常,但现在我要面对审计类的问题。
审核类是从基本域类扩展的,如下所示:
class Foo {
String baaar
}
class FooAudit extends Foo {
Long auditId
Date auditDate = new Date()
}
我的问题是我想在
FooAudit
中保留Foo
的ID,并拥有自己的ID属性。在将创建审计条目的服务方法中,我将获取源域类对象的所有属性的映射。
我想用此 map 设置
FooAudit
的属性,但该 map 还包含id
的Fooo
属性。如果我通过 map 设置属性,例如
def auditEntry = new FooAudit()
auditEntry.properties = map
这将设置
FooAudit
的标识与Foo
一样,但是我想拥有自己的FooAudit
标识如何将
auditId
属性设置为FooAudit
的标识符? 最佳答案
例如,对于具有特殊情况的属性复制,我有一个带有静态方法的类,如下所示(也许很有用……您可以按照自己喜欢的方式处理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
}