Я согласен с вами в том, что отражение сложных объектов становится немного сложным. У меня также был похожий случай использования, когда нужно сравнивать два объекта, и мой объект также был очень сложным (слишком много полей различного типа и цепочки ассоциаций).
Итак, мы слишком много искали хорошего пути и наткнулись на множество решений, включая рефлексию, сравнение JSON, но наиболее многообещающая среда, которую я ищу для работы, это Javers .
Простой пример может быть:
@Test
public void shouldCompareTwoEntities() {
//given
Javers javers = JaversBuilder.javers()
.withListCompareAlgorithm(LEVENSHTEIN_DISTANCE)
.build();
Employee frodoOld = EmployeeBuilder.Employee("Frodo")
.withAge(40)
.withPosition("Townsman")
.withSalary(10_000)
.withPrimaryAddress(new Address("Shire"))
.withSkills("management")
.withSubordinates(new Employee("Sam"))
.build();
Employee frodoNew = EmployeeBuilder.Employee("Frodo")
.withAge(41)
.withPosition("Hero")
.withBoss(new Employee("Gandalf"))
.withPrimaryAddress(new Address("Mordor"))
.withSalary(12_000)
.withSkills("management", "agile coaching")
.withSubordinates(new Employee("Sméagol"), new Employee("Sam"))
.build();
//when
Diff diff = javers.compare(frodoOld, frodoNew);
//then
assertThat(diff.getChanges()).hasSize(9);
}
javers.compare(frodoOld, frodoNew)
берет два объекта, сравнивает их и сообщает о различиях. В вашем случае объект имеет список, и элементы в списках могут быть в другом порядке, в таком случае Javers
сообщает о них как о разнице. Если вы хотите, чтобы порядок элементов игнорировался, то перед подачей Объектов в Javers
вы можете отсортировать списки, а затем сравнить.
Вы можете взглянуть на Документация JaVers
Простейшим примером будет:
Person pOld = new Person ();
pOld.setName("Foo"):
Person pNew = new Person ();
pNew.setName("Bar"):
Diff diff = javers.compare(pOld, pNew);
diff.getChanges()
выдаст список различий.