使用自定义比较器比较值对象
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
只能用于值类型。所以你有两个选择:
- 将人物映射为值,然后为
人。它有效但很尴尬,因为 Person 更像是一个
实体。
- 为字符串(所有字符串)注册一个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
}
我想以忽略空属性的方式比较值对象。
更具体地说,我只想在比较中包含值对象的那些属性,这些属性在 右侧 上不是空的。
例如
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
只能用于值类型。所以你有两个选择:
- 将人物映射为值,然后为 人。它有效但很尴尬,因为 Person 更像是一个 实体。
- 为字符串(所有字符串)注册一个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
}