Javers 将字段与注释进行比较
Javers Compare Fields with Annotations
我有一个 Java 8/Maven/Spring 引导项目。我正在使用 Javers 来审核我的应用程序中的更改,但是我创建了一个自定义注释,该注释位于 class 中的字段上方,如果更改,我希望对其进行审核。这是一个示例 class:
public class Foo {
@AuditThis
private final String someString;
private final int someInt;
@AuditThis
private final double someDouble;
private final long someLong;
@AuditThis
private final List<String> someList;
}
调用 javers.compare(foo1, foo2)
时,我希望它只比较顶部带有注释 @AuditThis
的字段。因此,在这种情况下,它只会比较 Foo
对象的 someString
、someDouble
、someList
字段。
我知道您可以设置自定义比较器,所以我尝试这样做:
public class AuditThisComparator implements CustomPropertyComparator<Object, ValueChange> {
@Override
public ValueChange compare(final Object left,
final Object right,
final GlobalId globalId,
final Property property) {
ValueChange change = null;
Field[] leftFields = left.getClass().getDeclaredFields();
Field[] rightFields = right.getClass().getDeclaredFields();
int upperBound = leftFields.length;
for (int i = 0; i < upperBound; i++) {
if (return i < leftFields.length && leftFields[i].getAnnotation(AuditThis.class) != null) {
change = new ValueChange(globalId, property.getName(), left, right);
break;
}
}
return change;
}
}
然后像这样注册:
Javers javers = JaversBuilder.javers()
.registerCustomComparator(new AuditThisComparator(), Object.class)
.build();
但是当我 .compare()
时,这个自定义比较器永远不会被调用。知道我做错了什么,或者是否有更简单的方法来解决这个问题?
我不能使用 @DiffIgnore
,因为我创建的自定义注释包含一些特殊参数,用户可以指定我们在审计过程中使用的这些参数。
JaVers @DiffInclude
属性 专为此而设计。见 https://javers.org/documentation/domain-configuration/#property-level-annotations
把它放在你想审计的字段上,其他的会被 JaVers 忽略。这是正确的方法,你不能注册你的注解。编写自定义比较器似乎是个坏主意,因为您必须复制 JaVers 差异算法。
我有一个 Java 8/Maven/Spring 引导项目。我正在使用 Javers 来审核我的应用程序中的更改,但是我创建了一个自定义注释,该注释位于 class 中的字段上方,如果更改,我希望对其进行审核。这是一个示例 class:
public class Foo {
@AuditThis
private final String someString;
private final int someInt;
@AuditThis
private final double someDouble;
private final long someLong;
@AuditThis
private final List<String> someList;
}
调用 javers.compare(foo1, foo2)
时,我希望它只比较顶部带有注释 @AuditThis
的字段。因此,在这种情况下,它只会比较 Foo
对象的 someString
、someDouble
、someList
字段。
我知道您可以设置自定义比较器,所以我尝试这样做:
public class AuditThisComparator implements CustomPropertyComparator<Object, ValueChange> {
@Override
public ValueChange compare(final Object left,
final Object right,
final GlobalId globalId,
final Property property) {
ValueChange change = null;
Field[] leftFields = left.getClass().getDeclaredFields();
Field[] rightFields = right.getClass().getDeclaredFields();
int upperBound = leftFields.length;
for (int i = 0; i < upperBound; i++) {
if (return i < leftFields.length && leftFields[i].getAnnotation(AuditThis.class) != null) {
change = new ValueChange(globalId, property.getName(), left, right);
break;
}
}
return change;
}
}
然后像这样注册:
Javers javers = JaversBuilder.javers()
.registerCustomComparator(new AuditThisComparator(), Object.class)
.build();
但是当我 .compare()
时,这个自定义比较器永远不会被调用。知道我做错了什么,或者是否有更简单的方法来解决这个问题?
我不能使用 @DiffIgnore
,因为我创建的自定义注释包含一些特殊参数,用户可以指定我们在审计过程中使用的这些参数。
JaVers @DiffInclude
属性 专为此而设计。见 https://javers.org/documentation/domain-configuration/#property-level-annotations
把它放在你想审计的字段上,其他的会被 JaVers 忽略。这是正确的方法,你不能注册你的注解。编写自定义比较器似乎是个坏主意,因为您必须复制 JaVers 差异算法。