In diesem Blog-Beitrag möchte ich Euch weitere Neuerungen der Jakarta EE Version 11 vorstellen. Heute geht es dabei um die Möglichkeit auch Java Records mit der Jakarta Validation (ehemals Bean Validation) überprüfen zu können.
Records bieten eine gute Möglichkeit ohne viel Boilerplate-Code unveränderliche Daten zu speichern. Ein einfaches Beispiel könnte ein Person-Record sein.
public record Person(String name, LocalDate birthday) {}
Über den Konstruktor erzeuge ich mir das unveränderliche Objekt und kann auf die Attribute ohne die Erzeugung von Getter-Methoden ganz einfach zugreifen.
var person = new Person("Maxi", LocalDate.of(1990, 1, 1));
person.name();
Hibernate Validator
Der Hibernate Validator implementiert in der Version 8.0.1.Final die neue Jakarta Validation 3.1 Spezifikation. Diese ist auch bereits im aktuellen Wildlfy 33 enthalten und kann dort bereits genutzt werden. Um die Beispiele nicht zu sehr aufzublähen, habe ich statt der Verwendung eines Anwendungsservers den Validator in Unit-Tests eingesetzt.
Um die Jakarta Validation auch in Records nutzen zu können, müssen wir unseren Record einfach durch die entsprechenden Annotationen erweitern.
public record Person(
@NotNull @Size(min = 2) String name,
@PastOrPresent LocalDate birthday) {
}
Im ersten Beispiel erzeugen wir eine Person, dessen Name nur einen Buchstaben enthält. Damit sollte dann auch eine ConstraintViolation bei der Validierung erzeugt werden.
var person = new Person("J", LocalDate.now());
var result = validator.validate(person);
assertThat(result).isNotEmpty();
Die Validierung kann auch in Records auf einbettbare Objekte einbezogen werden. Wir erweitern hierfür unser Beispiel um eine eingebettete Adresse.
public class Address {
@NotNull
private String street;
@NotNull
private String city;
@NotNull
@Pattern(regexp = "\\d{5}")
private String postcode;
public Address(String street, String city, String postcode) {
this.street = street;
this.city = city;
this.postcode = postcode;
}
}
public record Person(
@NotNull @Size(min = 2) String name,
@PastOrPresent LocalDate birthday,
@Valid Address address) {
}
Ich habe hier das einbettbare Objekt als klassische Java Klasse implementiert. An dieser Stelle hätte man natürlich ebenfalls ein Java-Record nutzen können. Das „hineinreichen“ der Validierung erfolgt hierbei, wie üblich durch die @Valid-Annotation. Eine ungültige Adresse mit einer vierstelligen Postleitzahl würde entsprechend zu einer ConstraintViolation führen.
var person = new Person("Mini", LocalDate.now(), new Address("Downtown", "Somewhere", "1234"));
var result = validator.validate(person);
assertThat(result).isNotEmpty();
Fazit
Mit Verwendung der Jakarta Validation in Version 3.1 lassen sich nun endlich auch Records als uneränderliche Datenspeicher nutzen. Darüber hinaus können Records nun auch als einbettbare Objekte in Jakarta Persistence eingesetzt werden. Natürlich auch hier im Zusammenhang mit der Jakarta Validation.
Der Quellcode zum Beispiel steht wie immer auf Github unter https://github.com/GEDOPLAN/js-records-demo für euch zur Verfügung.