У меня есть проект Java 8 / Maven / Spring Boot. Я использую Javers для аудита изменений в моем приложении, однако у меня есть созданная мной пользовательская аннотация, которая помещается над полями в классе, который я хочу проверять при изменении. Вот пример класса:
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
сверху. Следовательно, в этом случае он будет сравнивать только поля someString
, someDouble
, someList
объекта Foo
.
Я знаю, что вы можете настроить собственный компаратор, поэтому я попытался сделать что-то вроде этого:
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
, потому что пользовательская аннотация, которую я сделал, принимает некоторые специальные аргументы, которые пользователь может указать, которые мы используем в нашем процессе аудита.