当前位置: 首页 > 知识库问答 >
问题:

无法实现用于Javers比较的Cutom比较器

云默
2023-03-14

嗨,我是贾维斯的新手。

我有一个实体,我正在为它实现一个自定义比较器,以便使用Javers进行比较。

我的实体:-

包装com.devyansh.entity;

进口java.util.清单;

导入组织。贾维斯。果心元模型。注释。实体

@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=标枪。比较(new Ent(“aaa”,new ArrayList()),new Ent(“aaa,new ArrayList()));

我得到以下错误:-

MANAGED_CLASS_MAPPING_ERROR:给定javaClass'classcom.devyansh.entity.Ent'映射到CustomType,预期ManagedType

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

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

在这里mapedTypes是一个并发HashMap,它为用户定义的实体提供了一个自定义类型?

我们如何解决这个问题?

共有1个答案

华欣荣
2023-03-14

目前,CustomTypes对象仅在ObjectGraphs中受支持。当CustomTypes对象直接传递给Javers.compare()时,Javers无法为它们生成GlobalId。

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

 类似资料:
  • 我想检测到鲍勃在以下情况下将城市从伦敦改为巴黎:

  • 我在理解和使用比较器方面有一个问题,有人问我以下问题: 我在一个单独的Employee类中使用compareTo比较器接口来调用比较器对象的重载使用。 任何帮助,建议,代码行将非常感谢!!

  • 我有一个关于compareTo函数如何帮助比较器排序的问题,即o1。比较(o2)与o2。比较(o1) 如果两个字符串相等,则此方法返回0,否则返回正值或负值。如果第一个字符串在词典上大于第二个字符串,则结果为正,否则结果为负。 上面的陈述很简单,但是为什么o1.compare(o2)会给我一个升序,而o2.compare(o1)给了我一个降序? 如果我有整数值“5,10,3”,我得到3,5,10和

  • 我正在尝试编写一个使用最小优先级队列的算法,所以我在谷歌上四处查看并找到了PriorityQueue。不过,似乎为了使用它,我需要告诉它我希望它如何排列优先级,并且这样做的方法是使用比较器(我想比较我的“Node1”对象的特定数据字段)。更多的谷歌搜索提出了创建一个新的比较器的想法,它实现了比较器但覆盖了比较方法。我正在尝试的是这样(以及它的其他变体): 编译器有几个理由提出抗议,其中之一是我没有

  • 我有一个关于列表比较器的问题。我有一个带有表格的网页应用程序。我可以在这个表格中编辑数据,也可以删除行。当我编辑数据时,标准比较器工作正常,但当我删除行时,我有问题。这个问题很常见(我想),当我删除一行时,javers比较旧列表和现在的列表时,看起来是这样的:旧列表有两个对象,现在列表有一个对象(我删除了第一个),现在javers不知道哪个对象被删除了,他比较旧列表中的第一个对象和新列表中的第二个

  • 谁能解释一下为什么下面的代码不起作用: 但这一个有效: 换句话说,与创建普通类实例相比,接口实现何时是可互换的?当我使用compareTo()方法时会出现错误,该方法是Comparable接口的一部分,由所有包装类(如整数)实现。 所以我猜