2017-12-02 8 views
1

nullプロパティが無視されるように値オブジェクトを比較したいと考えています。
具体的には、右側のの値オブジェクトのプロパティを比較対象に含めたいだけです。 など。カスタムコンパレータを使用した値オブジェクトの比較

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クラス用のカスタムコンパレータを使用することはできません。
代わりに、Personクラスのすべての値タイプを含むカスタムコンパレータを登録する必要があります。つまり、Stringです。

これはジャバーズの意図された使用か、そのアプローチの代替手段ですか?

答えて

1

ここで重要なことは、CustomValueComparatorは値型に対してのみ使用できることです。だから、2つのオプションがあります:値として

  1. 地図人をして、あなたは 人のためのdiffのアルゴリズムを実装します。 Personはもっと エンティティのようなものなので、うまくいきます。
  2. String(すべての文字列)のCustomValueComparatorを登録してから、Person as Entityを使用できます。それは私が選択するオプションです。

は(グルーヴィー)、それがどのように動作するかを参照してください:詳細な回答のため

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 
} 
+0

感謝を。 CustomValueComparatorを使用して2番目のアプローチに進みます。 – LuedDev

関連する問題