Große Annotationen-Sammlung
Enterprise-Annotationen nach Kategorie: REST, DI, Transaktionen, JPA, Validation, Security, Resilience und Tests.
Version 3SammlungCodeDiagramm
In dieser Datei
Annotationen sind Laufzeitverträge
Annotationen steuern Routing, Transaktionen, Scopes, Persistenz, Validierung, Security, Resilience und Tests. Sie sind kein Dekor, sondern Architekturverhalten.
Parameter verstehen
Viele Fehler entstehen durch Defaults: FetchType, Cascade, Propagation, Rollback-Regeln, consumes/produces, Retry-Anzahl, Timeout und Security-Ausdruck.
Kategorie statt Auswendiglernen
Wer Annotationen nach Verantwortungsbereich lernt, versteht schneller, warum und wo sie eingesetzt werden.
Entscheidungen
| Entscheidung | Gute Praxis | Prüffrage |
|---|---|---|
| Fachliche Grenze | Zuerst Use Case, Invariante und Verantwortlichkeit klären. | Welche Geschäftsentscheidung wird geschützt? |
| Technische Grenze | Framework-/Library-Code hinter Port, Adapter oder Konfiguration kapseln. | Kann die Domain ohne Framework getestet werden? |
| Betrieb | Timeouts, Logs, Metriken, Traces, Security und Rollback definieren. | Wie erkennt der Betrieb Fehler rechtzeitig? |
Ausführliche Beispiele
Kombination im REST Controller
@RestController
@RequestMapping(path = "/api/orders", produces = MediaType.APPLICATION_JSON_VALUE)
@Validated
public class OrderController {
@PostMapping(consumes = MediaType.APPLICATION_JSON_VALUE)
@ResponseStatus(HttpStatus.CREATED)
public IdResponse place(@Valid @RequestBody PlaceOrderRequest request) {
return service.place(request);
}
}
JPA Annotationen bewusst einsetzen
@Entity
@Table(name = "orders")
public class OrderEntity {
@Id
private UUID id;
@Version // Optimistic Locking gegen verlorene Updates
private long version;
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
private List<OrderLineEntity> lines = new ArrayList<>();
}
Typische Stolperfallen
| Stolperfalle | Warum gefährlich |
|---|---|
| Annotation ohne Wirkmodell | Code sieht richtig aus, Verhalten ist aber unklar. |
| Zu viele Verantwortungen auf einer Klasse | Controller, Transaktion, Mapping und Security vermischen sich. |
| Defaultwerte ungeprüft | Produktion zeigt andere Effekte als erwartet. |
Annotationenkatalog
| Annotation | Bereich | Zweck | Wichtige Parameter | Risiko |
|---|---|---|---|---|
| @RestController | Spring MVC | REST Controller + ResponseBody | value/name | Entity direkt zurückgeben |
| @RequestMapping | Spring MVC | Pfad, Methode, Media Type | path, method, consumes, produces | Uneinheitliche Versionierung |
| @Path | JAX-RS | Ressourcenpfad | value | Pfadmodell nicht fachlich |
| @ApplicationScoped | CDI | Bean pro Anwendung | - | Mutable State |
| @RequestScoped | CDI | Bean pro Request | - | Async-Kontext falsch |
| @Transactional | Jakarta/Spring | Transaktionsgrenze | propagation/isolation/rollback | Proxy-Grenze, lange TX |
| @Entity | JPA | Persistenzklasse | name | API und Entity vermischen |
| @Version | JPA | Optimistic Locking | - | Lost Updates |
| @OneToMany | JPA | 1:n Beziehung | mappedBy/cascade/orphanRemoval/fetch | N+1 oder falsches Cascade |
| @Valid | Bean Validation | Objektgraph validieren | groups | Nur Controller-Validierung |
| @PreAuthorize | Spring Security | Methodenautorisierung | SpEL | Objektberechtigung fehlt |
| @RolesAllowed | Jakarta Security | Rollenprüfung | value | Rolle = Fachrecht |
| @Retry | MicroProfile FT | Retry-Regel | maxRetries/delay/retryOn | Nicht-idempotente Operation |
| @Timeout | MicroProfile FT | Zeitlimit | value | Timeout größer als Budget |
| @CircuitBreaker | MicroProfile FT | Fehlerkreis öffnen | threshold/window | Ohne Monitoring unklar |
| @RegisterRestClient | MicroProfile | REST Client registrieren | configKey | Timeout fehlt |
| @KafkaListener | Spring Kafka | Kafka Consumer | topics/groupId | Idempotenz fehlt |
| @Cacheable | Spring Cache | Methode cachen | cacheNames/key/condition | Mandant fehlt im Key |
| @ConfigurationProperties | Spring Boot | Konfiguration typisieren | prefix | Secrets/Defaults unklar |
| @QuarkusTest | Quarkus | Quarkus Integration Test | - | Zu groß für Domain |
| @MicronautTest | Micronaut | Micronaut Context Test | - | Container für Unit Test |