Einführung zu JaVers
1. Überblick
In diesem Artikel werden wir uns die BibliothekJaVersansehen.
Diese Bibliothek hilft Programmierern, Änderungen in den Zuständen einfacher Java-Objekte zu untersuchen und zu erkennen. Wenn wir veränderbare Objekte in unserem Code verwenden, kann jedes Objekt möglicherweise an verschiedenen Stellen in der Anwendung geändert werden. JaVers would help us discover and audit these changes.
2. Maven-Abhängigkeit
Um zu beginnen, fügen wir diejavers-core Maven-Abhängigkeit zu unserenpom.xml hinzu:
org.javers
javers-core
3.1.0
Wir können die neueste Version überMaven Central finden.
3. POJO-Statusänderungen erkennen
Beginnen wir mit einer einfachenPerson-Klasse:
public class Person {
private Integer id;
private String name;
// standard getters/constructors
}
Angenommen, wir haben in einem Teil unserer Anwendung einPerson-Objekt erstellt, und in einem anderen Teil der Codebasis wurde der Name desthe person with the same id-Felds geändert. Wir wollen sie vergleichen, um herauszufinden, welche Art von Änderungen mit dem Personenobjekt geschehen sind.
Wir können diese beiden Objekte mit dercompare()-Methode aus derJaVers-Klasse vergleichen:
@Test
public void givenPersonObject_whenApplyModificationOnIt_thenShouldDetectChange() {
// given
Javers javers = JaversBuilder.javers().build();
Person person = new Person(1, "Michael Program");
Person personAfterModification = new Person(1, "Michael Java");
// when
Diff diff = javers.compare(person, personAfterModification);
// then
ValueChange change = diff.getChangesByType(ValueChange.class).get(0);
assertThat(diff.getChanges()).hasSize(1);
assertThat(change.getPropertyName()).isEqualTo("name");
assertThat(change.getLeft()).isEqualTo("Michael Program");
assertThat(change.getRight()).isEqualTo("Michael Java");
}
4. Erkennen einer Statusänderung der Objektliste
Wenn wir mit Sammlungen von Objekten arbeiten, müssen wir ebenfalls Statusänderungen untersuchen, indem wir uns jedes Element in der Sammlung ansehen. Manchmal möchten wir ein bestimmtes Objekt zur Liste hinzufügen oder daraus entfernen, um seinen Status zu ändern.
Let’s have a look at an example; Angenommen, wir haben eine Liste von Objekten und entfernen ein Objekt aus dieser Liste.
Diese Änderung kann aus irgendeinem Grund unerwünscht sein, und wir möchten die in dieser Liste vorgenommenen Änderungen überwachen. JaVers ermöglicht es uns, dies mit dercompareCollections()-Methode zu tun:
@Test
public void givenListOfPersons_whenCompare_ThenShouldDetectChanges() {
// given
Javers javers = JaversBuilder.javers().build();
Person personThatWillBeRemoved = new Person(2, "Thomas Link");
List oldList =
Lists.asList(new Person(1, "Michael Program"), personThatWillBeRemoved);
List newList =
Lists.asList(new Person(1, "Michael Not Program"));
// when
Diff diff = javers.compareCollections(oldList, newList, Person.class);
// then
assertThat(diff.getChanges()).hasSize(3);
ValueChange valueChange =
diff.getChangesByType(ValueChange.class).get(0);
assertThat(valueChange.getPropertyName()).isEqualTo("name");
assertThat(valueChange.getLeft()).isEqualTo("Michael Program");
assertThat(valueChange.getRight()).isEqualTo("Michael Not Program");
ObjectRemoved objectRemoved = diff.getChangesByType(ObjectRemoved.class).get(0);
assertThat(
objectRemoved.getAffectedObject().get().equals(personThatWillBeRemoved))
.isTrue();
ListChange listChange = diff.getChangesByType(ListChange.class).get(0);
assertThat(listChange.getValueRemovedChanges().size()).isEqualTo(1);
}
5. Objektdiagramme vergleichen
In realen Wortanwendungen beschäftigen wir uns häufig mit den Objektgraphen. Nehmen wir an, wir haben einePersonWithAddress-Klasse mit einer Liste derAddress-Objekte und fügen eine neue Adresse für die angegebene Person hinzu.
Wir können leicht die Art der Änderung finden, die aufgetreten ist:
@Test
public void givenListOfPerson_whenPersonHasNewAddress_thenDetectThatChange() {
// given
Javers javers = JaversBuilder.javers().build();
PersonWithAddress person =
new PersonWithAddress(1, "Tom", Arrays.asList(new Address("England")));
PersonWithAddress personWithNewAddress =
new PersonWithAddress(1, "Tom",
Arrays.asList(new Address("England"), new Address("USA")));
// when
Diff diff = javers.compare(person, personWithNewAddress);
List objectsByChangeType = diff.getObjectsByChangeType(NewObject.class);
// then
assertThat(objectsByChangeType).hasSize(1);
assertThat(objectsByChangeType.get(0).equals(new Address("USA")));
}
Ebenso wird das Entfernen einer Adresse erkannt:
@Test
public void givenListOfPerson_whenPersonRemovedAddress_thenDetectThatChange() {
// given
Javers javers = JaversBuilder.javers().build();
PersonWithAddress person =
new PersonWithAddress(1, "Tom", Arrays.asList(new Address("England")));
PersonWithAddress personWithNewAddress =
new PersonWithAddress(1, "Tom", Collections.emptyList());
// when
Diff diff = javers.compare(person, personWithNewAddress);
List objectsByChangeType = diff.getObjectsByChangeType(ObjectRemoved.class);
// then
assertThat(objectsByChangeType).hasSize(1);
assertThat(objectsByChangeType.get(0).equals(new Address("England")));
}
6. Fazit
In diesem kurzen Artikel haben wir die JaVers-Bibliothek verwendet, eine nützliche Bibliothek, die uns APIs zum Erkennen von Statusänderungen in unseren Objekten bietet. Es kann nicht nur die Änderung in einem einfachen POJO-Objekt erkennen, sondern auch komplexere Verschiebungen in den Sammlungen von Objekten oder sogar Objektgraphen.
Wie immer ist der Codeover on GitHub verfügbar.