使用自定义比较器比较值对象

Compare value objects using a custom comparator

我想以忽略空属性的方式比较值对象。
更具体地说,我只想在比较中包含值对象的那些属性,这些属性在 右侧 上不是空的。 例如

class Person {
  String name;
  String surname;   
}


Person personLeft = new Person();
personLeft.name = "John";
personLeft.surname = "Doe";

Person personRight = new Person();
personRight.name="John"


// this should NOT yield any changes
javers.compare(personLeft, personRight);


// that comparison however, will show that surname has changed
javers.compare(personRight, personLeft);

虽然我可以通过编写自定义比较器并为 Person 注册来解决这个问题。 不幸的是,这个比较器从未被调用过。 偶然发现 post,我担心使用 Person class.
的自定义比较器是不可能的 相反,我必须为所有包含 Person class 的值类型注册自定义比较器,即 String.

这是 javers 的预期用途还是有任何替代方法?

这里重要的是 CustomValueComparator 只能用于值类型。所以你有两个选择:

  1. 将人物映射为值,然后为 人。它有效但很尴尬,因为 Person 更像是一个 实体。
  2. 为字符串(所有字符串)注册一个CustomValueComparator,然后就可以将Person用作Entity了。这是我会选择的选项。

看看它是如何工作的(groovy):

class Entity {
    @Id int id
    Person person
}

class Person {
    String name
}

def "should use CustomValueComparator for Person when Person is mapped as Value"(){
  given:
    def javers = JaversBuilder.javers().registerValue(Person,
            { l, r -> if (r.name == null) return true
                      else return r.name.equals(l.name)
            }).build()

    def personLeft = new Person(name: "john")
    def personRight = new Person()

    def eLeft = new Entity(id:1, person: personLeft)
    def eRight = new Entity(id:1, person: personRight)

  expect:
    javers.compare(eLeft, eRight).changes.size() == 0
    javers.compare(eRight, eLeft).changes.size() == 1

    javers.getTypeMapping(Person) instanceof ValueType
}

def "should used CustomValueComparator for Strings"(){
  given:
    def javers = JaversBuilder.javers().registerValue(String,
          { l, r -> if (r == null) return true
          else return r.equals(l)
          }).build()

    def personLeft = new Person(name: "john")
    def personRight = new Person()

  expect:
    javers.compare(personLeft, personRight).changes.size() == 0
    javers.compare(personRight, personLeft).changes.size() == 1

    javers.getTypeMapping(Person) instanceof ValueObjectType
}