© Excellent backgrounds/Shutterstock.com
Kolumne: EnterpriseTales

Kolumne: EnterpriseTales


Unsere kleine Serie zum Thema Java 8 und Enterprise geht nun schon in die vierte Runde. Heute wollen wir das Java-8-Thema der „Repeatable Annotations“ näher betrachten und dessen Bedeutung für Java EE unter die Lupe nehmen.

Bis in Java 7 war es nicht möglich, ein und dieselbe Annotation mehrfach an eine Klasse zu setzen, selbst wenn die Annotation mit verschiedenen Parametern gefüttert wurde.

Seit Java 8 hat sich das geändert. Gewisse Annotations lassen sich mehrfach an Klassen, Felder oder Methoden setzen. Möglich macht das die Annotation @ Repeat­able [1] und ein kleiner Compiler-Trick, der in Java 8 eingebaut wurde. Mit diesem Trick übernimmt in Java 8 der Compiler das, was in Java 7 der Entwickler von Hand machen muss, wie wir später sehen werden.

Mehrfach-Annotations in Java EE

Wenn man in Java 7 oder früheren Versionen eine Annotation mehrfach an eine Klasse schreiben will, so benötigt man immer eine Wrapper Annotation. Möchte man z. B. eine JPA-Entity mit mehr als einer @NamedQuery versehen, so muss man dazu die Wrapper Annotation @ NamedQueries verwenden [2]. Diese kapselt ein Array von @NamedQuery Annotations, wodurch es möglich wird, mehr als eine davon an eine Entity zu schreiben. Gleiches gilt für weitere Annotations im JPA-Standard.

Auch im BeanValidation-Standard werden solche Annotations zur Verfügung gestellt. BeanValidation-Implementierungen erkennen solche Annotations sogar automatisch. Dadurch ist es möglich, auch für eigene Constraint Annotations solche Wrapper Annotations zu schreiben [3]. Die BeanValidation Spec schlägt dazu ein eigenes Pattern vor: Für jede Constraint Annotation wird eine Annotation namens List als innere Klasse definiert, die als Wrapper Annotation fungiert. Bei den Constraint Annotations, die von der Spezifikation mitgeliefert werden (wie @NotNull, @Min, @Max usw.), wurde dieses Pattern auch angewendet. Bei selbstdefinierten Constraints empfiehlt sich die Verwendung des Patterns ebenfalls (Listing 1).

Listing 1

@Constraint(validatedBy = ...) @Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER} @Retention(RUNTIME) @Repeatable(MyCustomConstraint.List.class) public @interface MyCustomConstraint { String myCustomValue(); public @interface List { MyCustomConstraint[] value(); } }

Repeatable Annotations in Java 8

Was haben diese Wrapper Annotations aber mit den Repeatable Annotations in Java 8 zu tun? Sehr viel, denn der oben bereits erwähnte kleine Compilertrick basiert darauf, dass der Compiler jedes M...

Neugierig geworden?

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang