Невозможно реализовать компаратор Cutom для сравнения Javers

Привет, я новичок в Javers.

У меня есть сущность, для которой я реализую пользовательский компаратор для сравнения с использованием Javers.

Моя сущность: -

пакет com.devyansh.entity;

импортировать java.util.List;

импортировать org.javers.core.metamodel.annotation.Entity;

@Entity
public class Ent {

    String value;
    List<String> values;
    public Ent(String value, List<String> values) {
        super();
        this.value = value;
        this.values = values;
    }
    public String getValue() {
        return value;
    }
    public void setValue(String value) {
        this.value = value;
    }
    public List<String> getValues() {
        return values;
    }
    public void setValues(List<String> values) {
        this.values = values;
    }


}

Ниже я регистрирую новый компаратор: -

public void comp(){

    Javers javers = JaversBuilder.javers().registerCustomComparator(new FunnyStringComparator(), Ent.class).build();

    Diff diff = javers.compare(new Ent("aaa", new ArrayList<String>()), new Ent("aaa",new ArrayList<String>()));

    System.out.println(diff.getChanges());
}

Моя реализация компаратора: -

package com.devyansh.javers;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Optional;
import java.util.Set;

import com.devyansh.entity.Ent;
import com.google.common.collect.Sets; 

import org.javers.core.diff.changetype.PropertyChangeMetadata;
import org.javers.core.diff.changetype.container.ContainerElementChange;
import org.javers.core.diff.changetype.container.SetChange;
import org.javers.core.diff.changetype.container.ValueAdded;
import org.javers.core.diff.changetype.container.ValueRemoved;
import org.javers.core.diff.custom.CustomPropertyComparator;
import org.javers.core.metamodel.property.Property;

public class FunnyStringComparator implements CustomPropertyComparator<Ent, SetChange> {

    @Override
    public Optional<SetChange> compare(Ent left, Ent right, PropertyChangeMetadata metadata,
            Property property) {
        // TODO Auto-generated method stub
        System.out.println("Hello!!!!!");


            return null ;


    }

    @Override
    public boolean equals(Ent a, Ent b) {
        // TODO Auto-generated method stub
        return false;
    }



}

ПРОБЛЕМНАЯ ОБЛАСТЬ: -

КОГДА Я ПЫТАЮСЬ СРАВНИТЬ, ИСПОЛЬЗУЯ НИЖЕ ЛИНИЮ: -

Diff diff = javers.compare(new Ent("aaa", new ArrayList()), new Ent("aaa", new ArrayList()));

Я получаю следующую ошибку: -

MANAGED_CLASS_MAPPING_ERROR: данный javaClass 'class com.devyansh.entity.Ent' сопоставляется с CustomType, ожидаемым ManagedType

Может кто-нибудь, пожалуйста, дайте мне знать, что я делаю неправильно??? Я попытался отладить API Javers, ниже функция называется: -

JaversType get(Type javaType) {
    return mappedTypes.get(javaType.toString());
}

здесь mappedTypes — это concurrentHashMap, и он повторяет customType для пользовательских сущностей?

Как мы можем это решить?


person user3668556    schedule 11.09.2019    source источник


Ответы (1)


В настоящее время объекты CustomTypes поддерживаются только тогда, когда они находятся внутри ObjectGraphs. Когда объекты CustomTypes передаются непосредственно в Javers.compare(), Javers не может сгенерировать для них GlobalId.

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

person Bartek Walacik    schedule 13.09.2019
comment
Привет, я понимаю ваш ответ, но что, если мы хотим сравнить несколько объектов внутри ObjectGraphs, используя один и тот же пользовательский компаратор? потому что, когда мы регистрируем пользовательский компаратор, он принимает только один аргумент для типа, который он будет сравнивать - person user3668556; 13.09.2019
comment
Объекты CustomType всегда сравниваются неглубоко. Так что теперь они могут быть только листьями в ObjectGraph. - person Bartek Walacik; 13.09.2019
comment
Привет, я попытался сравнить 2 объекта Userdifend, используя два списка пользовательских объектов javers2.compare(owner2, owner1); owner2 и owner 1 - это два списка владельцев... НО МОЙ КОМПАРАТОР НЕ ВЫЗЫВАЕТ, ВМЕСТО ПОЛУЧИЛ ПРЕДУПРЕЖДЕНИЕ НА КОНСОЛИ ECLIPSE: - Неизвестный тип элемента в свойстве List: Список полей; //объявлено в ListWrapper. По умолчанию используется объект, см. CorePropertyChangeAppender.GENERIC_TYPE_NOT_PARAMETRIZED. Я хочу сравнить каждый элемент внутри моего объекта списка. Не могли бы вы подсказать, что я делаю неправильно? - person user3668556; 16.09.2019
comment
это другой вопрос? - person Bartek Walacik; 16.09.2019
comment
Да, но на основе вашего предыдущего ответа - person user3668556; 17.09.2019