java - 无法实现 Javers 比较的自定义比较器

标签 java entity javers

嗨,我是 Javers 的新手。

我有一个 Entity ,我正在为其实现一个自定义比较器,以便使用 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

有人可以告诉我我做错了什么吗???我尝试调试 Javers api ,调用以下函数:-

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

这里的mappedTypes是一个concurrentHashMap,它为用户定义的实体返回一个customType?

我们如何解决这个问题?

最佳答案

目前,仅当 CustomTypes 对象位于 ObjectGraph 内部时才受支持。 当 CustomTypes 对象直接传递给 Javers.compare() 时,Javers 无法为它们生成 GlobalId。

我已经为此案例创建了问题 https://github.com/javers/javers/issues/882 ,欢迎贡献。

关于java - 无法实现 Javers 比较的自定义比较器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57887135/

相关文章:

hibernate - 如何在 JPA 实体管理器中锁定整个实体(表)

java - JPA - 按周数获取实体 - Java EE

java - 有效的审计方式

java - 如何停止 @ManyToOne JPA 中的重复对象?

java - Eclipse RCP 在编辑器中更改后更新 View

c# - 从linq中的第n条记录中选择n条记录

java - 如何对 "state"表中的 "jv snapshot"列使用压缩来减少数据库大小?

java - JaVers - 如何添加额外字段以引用 JSON 中的实体

java - 使用 Arrays.asList 将基元数组转换为列表

java - Android Studio "Unfortunately the Application had to stop"错误。