java / intermediate
Snippet
Durchsetzen benutzerdefinierter Domänendaten-Einschränkungen mit ConstraintValidator
Benutzerdefinierte Validierungsannotationen in Spring nutzen Jakarta Bean Validation in Verbindung mit Spring Dependency Injection. Durch die Auszeichnung des ConstraintValidators als Spring-Komponente kann der Validator bei Bedarf weitere Beans injizieren und fachliche Validierungen direkt auf eingehenden DTO-Records und Request-Objekten ausführen.
snippet.java
java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@Target({ElementType.FIELD, ElementType.PARAMETER})@Retention(RetentionPolicy.RUNTIME)@Constraint(validatedBy = IbanChecksumValidator.class)@Documentedpublic @interface ValidIban {String message() default "Invalid IBAN checksum structure";Class<?>[] groups() default {};Class<? extends Payload>[] payload() default {};}@Componentpublic class IbanChecksumValidator implements ConstraintValidator<ValidIban, String> {@Overridepublic boolean isValid(String value, ConstraintValidatorContext context) {if (value == null || value.isBlank()) {return true;}String sanitized = value.replaceAll("\\s+", "");return sanitized.matches("^[A-Z]{2}\\d{2}[A-Z0-9]{1,30}$");}}public record TransferRequest(@ValidIban String destinationIban, BigDecimal amount) {}
spring
Erklärung
1
@Constraint(validatedBy = IbanChecksumValidator.class)
Verknüpft die Validierungs-Annotation mit der konkreten Implementierungsklasse der Prüflogik.
2
public class IbanChecksumValidator implements ConstraintValidator<ValidIban, String>
Implementiert die Validierungsprüfung für String-Felder, die mit @ValidIban annotiert sind.
3
public record TransferRequest(@ValidIban String destinationIban, BigDecimal amount) {}
Wendet die Domänenvalidierung direkt auf Record-Komponenten an, die während des @Valid-Bindings geprüft werden.