0 Tage Serie
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)
@Documented
public @interface ValidIban {
String message() default "Invalid IBAN checksum structure";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
@Component
public class IbanChecksumValidator implements ConstraintValidator<ValidIban, String> {
@Override
public 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.