Javers Сравнить поля с аннотациями - PullRequest
0 голосов
/ 14 сентября 2018

У меня есть проект 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, потому что пользовательская аннотация, которую я сделал, принимает некоторые специальные аргументы, которые пользователь может указать, которые мы используем в нашем процессе аудита.

1 Ответ

0 голосов
/ 15 сентября 2018

JaVers имеет свойство @DiffInclude, предназначенное для этого. см https://javers.org/documentation/domain-configuration/#property-level-annotations

Поместите его в поля, которые вы хотите проверить, и JaVers проигнорирует другие. Это правильный путь, вы не можете зарегистрировать свою аннотацию. Написание пользовательских компараторов кажется плохой идеей, потому что вам придется дублировать алгоритм сравнения JaVers.

...