Große Annotationen-Sammlung

Enterprise-Annotationen nach Kategorie: REST, DI, Transaktionen, JPA, Validation, Security, Resilience und Tests.

Version 2SammlungCodeDiagramm
Diagramm Große Annotationen-Sammlung
Fachlich-technische Darstellung zu Große Annotationen-Sammlung.

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

EntscheidungGute PraxisPrüffrage
Fachliche GrenzeZuerst Use Case, Invariante und Verantwortlichkeit klären.Welche Geschäftsentscheidung wird geschützt?
Technische GrenzeFramework-/Library-Code hinter Port, Adapter oder Konfiguration kapseln.Kann die Domain ohne Framework getestet werden?
BetriebTimeouts, 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

StolperfalleWarum gefährlich
Annotation ohne WirkmodellCode sieht richtig aus, Verhalten ist aber unklar.
Zu viele Verantwortungen auf einer KlasseController, Transaktion, Mapping und Security vermischen sich.
Defaultwerte ungeprüftProduktion zeigt andere Effekte als erwartet.

Annotationenkatalog

AnnotationBereichZweckWichtige ParameterRisiko
@RestControllerSpring MVCREST Controller + ResponseBodyvalue/nameEntity direkt zurückgeben
@RequestMappingSpring MVCPfad, Methode, Media Typepath, method, consumes, producesUneinheitliche Versionierung
@PathJAX-RSRessourcenpfadvaluePfadmodell nicht fachlich
@ApplicationScopedCDIBean pro Anwendung-Mutable State
@RequestScopedCDIBean pro Request-Async-Kontext falsch
@TransactionalJakarta/SpringTransaktionsgrenzepropagation/isolation/rollbackProxy-Grenze, lange TX
@EntityJPAPersistenzklassenameAPI und Entity vermischen
@VersionJPAOptimistic Locking-Lost Updates
@OneToManyJPA1:n BeziehungmappedBy/cascade/orphanRemoval/fetchN+1 oder falsches Cascade
@ValidBean ValidationObjektgraph validierengroupsNur Controller-Validierung
@PreAuthorizeSpring SecurityMethodenautorisierungSpELObjektberechtigung fehlt
@RolesAllowedJakarta SecurityRollenprüfungvalueRolle = Fachrecht
@RetryMicroProfile FTRetry-RegelmaxRetries/delay/retryOnNicht-idempotente Operation
@TimeoutMicroProfile FTZeitlimitvalueTimeout größer als Budget
@CircuitBreakerMicroProfile FTFehlerkreis öffnenthreshold/windowOhne Monitoring unklar
@RegisterRestClientMicroProfileREST Client registrierenconfigKeyTimeout fehlt
@KafkaListenerSpring KafkaKafka Consumertopics/groupIdIdempotenz fehlt
@CacheableSpring CacheMethode cachencacheNames/key/conditionMandant fehlt im Key
@ConfigurationPropertiesSpring BootKonfiguration typisierenprefixSecrets/Defaults unklar
@QuarkusTestQuarkusQuarkus Integration Test-Zu groß für Domain
@MicronautTestMicronautMicronaut Context Test-Container für Unit Test
⌂ Cockpit