我当前正在创建一些域类的审核,并创建了一个AuditingListener来调用ServiceMethod来保存旧数据。

在此服务方法中,我通过一些命名约定来获取域类的审核类。

一切正常,但现在我要面对审计类的问题。
审核类是从基本域类扩展的,如下所示:

class Foo {
   String baaar
}
class FooAudit extends Foo {
    Long auditId
    Date auditDate = new Date()
}

我的问题是我想在FooAudit中保留Foo的ID,并拥有自己的ID属性。
在将创建审计条目的服务方法中,我将获取源域类对象的所有属性的映射。
我想用此 map 设置FooAudit的属性,但该 map 还包含idFooo属性。

如果我通过 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
}

10-06 08:04