Использование CustomPropertyComparator с java.util.List - PullRequest
0 голосов
/ 21 ноября 2018

Я создал CustomPropertyComparator, чтобы использовать его для сравнения объектов, которые были созданы jaxb.Так что в моем случае я не могу использовать аннотацию @ DiffIgnore , предлагаемую платформой.Также коллекции, созданные jaxb, основаны на java.util.List, а не на java.util.Collection.К сожалению, мне не удалось заставить javers использовать мой CustomPropertyComparator с List-Interface.

public class Person {    
    private String name;
    private String ignoreThis;
}

public class Company {
    private String id;
    private Person owner;
    private Collection<Person> clients;
    private List<Person> partners;
}

Компаратор, который сравнивает только имя, но игнорирует поле «ignoreThis»

public class EntityComparator implements CustomPropertyComparator<Person, ValueChange> {
    public ValueChange compare(Person left, Person right, GlobalId affectedId, Property property) {
        if (left.getName().equals(right.getName()))
            return null;
        return new ValueChange(affectedId, "entity/name", left.getName(), right.getName());
    }    
}

Мои тестовые случаи выглядят так:

Этот тест работает, потому что он сравнивает коллекцию

@Test
public void equalEntityClientTest() {
    Person e1 = new Person("james", "ignore this");
    Company le1 = new Company("1", null, Arrays.asList(e1), null);

    Person e2 = new Person("james", "");
    Company le2 = new Company("1", null, Arrays.asList(e2), null);
    Diff diff = javers.compare(le1, le2);

    System.out.println(diff);
    assertEquals(0, diff.getChanges().size());
}

Этот тест не пройден, потому что он не использует мой компаратор для сравнения сущности иdiff игнорируемого поля имеет значение true.

@Test
public void equalEntityPartnerTest() {
    Person e1 = new Person("james", "ignore this");
    Company le1 = new Company("1", e1, null, Arrays.asList(e1));

    Person e2 = new Person("james", "");
    Company le2 = new Company("1", e2, null, Arrays.asList(e2));
    Diff diff = javers.compare(le1, le2);

    System.out.println(diff);
    assertEquals(0, diff.getChanges().size());
}

В справочнике javers они объясняют, если у вас есть собственный Collection-Interface, вам нужно реализовать свой собственный компаратор, что нормально, если вы используете коллекцию, не основанную нана java.util.Collection.Но на самом деле я ожидал бы, что java.util.List поддерживается библиотекой javers.Также я не смог выяснить, как я могу добавить / создать Компаратор для List-Interface.

Рабочий пример можно найти по адресу: https://github.com/baumgartner/javerstest

1 Ответ

0 голосов
/ 25 ноября 2018

Вы затронули два вопроса здесь.Ваш первый тест пройден, потому что Javers игнорирует Collection свойства и регистрируется только это предупреждение:

10:19:40.332 [main] WARN  o.j.c.d.a.CollectionChangeFakeAppender - Collections: Field Collection<Person> clients; //declared in Company
are not equals but can't be compared. Raw Collection properties are not supported. Expected Set, List or any of their subclasses. JaVers uses different algorithms for comparing Sets and Lists and needs to know (statically) which one to test.

Я думаю, что это не в порядке, поэтому я создал проблему, см. https://github.com/javers/javers/issues/746

Второй вопрос касается CustomPropertyComparator.Он был разработан для сравнения больших структур, таких как Multimap, и не вызывается JaVers при сравнении элементов списка, потому что при сравнении элементов списка вам нужен метод boolean equals(a,b).Это то, что делает CustomValueComparator.

Несмотря на то, что CustomPropertyComparator может быть расширен для использования метода boolean equals(a,b).Я создал второй выпуск для этого, см. https://github.com/javers/javers/issues/747

...