Brugerdefinerede validatorer
Skriv Deres egne valideringsbegrænsninger.
Brugerdefinerede validatorer er en gratis Spring Boot 4-mikrotjenester og REST-API'er-lektion på CoddyKit. Dette er lektion 2 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Spring Boot 4-mikrotjenester og REST-API'er, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Spring Boot 4-mikrotjenester og REST-API'er-kurset indeholder 4 lektioner i alt.
Når de indbyggede funktioner ikke er nok
Standardbegrænsninger kan ikke udtrykke alle regler — f.eks. et gyldigt format for en kuponkode, et telefonnummer for en bestemt region eller en værdi, der skal findes i databasen. I sådanne tilfælde skriver du en brugerdefineret begrænsning, der understøttes af en validator.
To dele af en brugerdefineret begrænsning
En brugerdefineret begrænsning består af to dele:
- En annotering, som du placerer på felter eller parametre
- En ConstraintValidator, der indeholder den faktiske kontrol-logik
Definition af annoteringen
Opret annoteringen, og forbind den med dens validator ved hjælp af @Constraint. Erklær standardmedlemmerne message, groups og payload, som specifikationen kræver.
@Target({ FIELD, PARAMETER })
@Retention(RUNTIME)
@Constraint(validatedBy = StrongPasswordValidator.class)
public @interface StrongPassword {
String message() default "Password is not strong enough";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}Implementering af ConstraintValidator
Validatoren implementerer ConstraintValidator<Annotation, Type> og tilsidesætter isValid. Returnér true, når værdien opfylder reglen.
public class StrongPasswordValidator
implements ConstraintValidator<StrongPassword, String> {
@Override
public boolean isValid(String value, ConstraintValidatorContext ctx) {
if (value == null) return true; // let @NotNull handle null
return value.length() >= 8
&& value.chars().anyMatch(Character::isDigit)
&& value.chars().anyMatch(Character::isUpperCase);
}
}Konvention for håndtering af null
Efter konventionen behandler en brugerdefineret validator null som gyldig og overlader kontrollen af null-værdier til @NotNull. Det holder begrænsningerne sammensættelige — hver regel udfører én opgave.
Brug af den brugerdefinerede begrænsning
Anvend din annotering ligesom en indbygget annotering. Sammen med @Valid på controlleren deltager den i det normale valideringsforløb.
public class CreateUserRequest {
@NotBlank
@StrongPassword
private String password;
}Brugerdefinerede overtrædelsesmeddelelser
Inde i isValid kan du deaktivere standardmeddelelsen og tilføje en kontekstafhængig meddelelse, hvilket er nyttigt, når en enkelt annotering håndhæver flere delregler.
ctx.disableDefaultConstraintViolation();
ctx.buildConstraintViolationWithTemplate(
"Password must include a digit and an uppercase letter")
.addConstraintViolation();
return false;Indsprøjtning af beans i en validator
En ConstraintValidator er en Spring-bean, så den kan bruge konstruktørindsprøjtning — og dermed understøtte regler, der slår op i et repository eller en tjeneste, f.eks. kontrol af entydighed.
public class UniqueEmailValidator
implements ConstraintValidator<UniqueEmail, String> {
private final UserRepository repo;
public UniqueEmailValidator(UserRepository repo) { this.repo = repo; }
@Override
public boolean isValid(String email, ConstraintValidatorContext ctx) {
return email == null || !repo.existsByEmail(email);
}
}Begrænsninger på klasseniveau
Nogle regler omfatter flere felter — "password skal være lig med confirmPassword." Målret annoteringen mod TYPE, og validér hele objektet ved at tilgå flere felter samlet.
@Target(TYPE)
@Retention(RUNTIME)
@Constraint(validatedBy = PasswordsMatchValidator.class)
public @interface PasswordsMatch {
String message() default "Passwords do not match";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}Initialiseringsmetode
Tilsidesæt initialize for at hente attributter fra annoteringsinstansen, f.eks. en konfigurerbar minimumslængde, før valideringen kører.
@Override
public void initialize(StrongPassword ann) {
this.minLength = ann.minLength();
}Hold validatorer rene og hurtige
Validatorer kører ved hver forespørgsel, så hold dem hurtige og uden sideeffekter, hvor det er muligt. Databasebaserede kontroller er fine, men de bør være indekserede og lette for at undgå at gøre behandlingen af forespørgsler langsommere.
Hurtig kontrol
Test din forståelse af brugerdefinerede validatorer.
Opsummering
Brugerdefinerede validatorer udvider Bean Validation.
- En begrænsning er en
@Constraint-annotering plus enConstraintValidator - Tilsidesæt
isValid; behandl efter konventionnullsom gyldig - Validatorer er beans, så de understøtter konstruktørindsprøjtning
- Brug begrænsninger på klasseniveau til regler på tværs af felter
- Tilpas meddelelser via valideringskonteksten
Lær Java med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 24
- Lektioner
- 93
Ofte stillede spørgsmål
Er lektionen “Brugerdefinerede validatorer” gratis?
Ja — hele teksten til “Brugerdefinerede validatorer” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Spring Boot 4-mikrotjenester og REST-API'er-kurset, skal du opgradere til CoddyKit PRO. Spring Boot 4-mikrotjenester og REST-API'er-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Brugerdefinerede validatorer”?
Skriv Deres egne valideringsbegrænsninger. Du øver dig i Spring Boot 4-mikrotjenester og REST-API'er med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Spring Boot 4-mikrotjenester og REST-API'er?
Der kræves ingen tidligere erfaring. Spring Boot 4-mikrotjenester og REST-API'er på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 4.
Hvor lang tid tager lektionen “Brugerdefinerede validatorer”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Spring Boot 4-mikrotjenester og REST-API'er-lektion?
Ja. Alle Spring Boot 4-mikrotjenester og REST-API'er-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Bean-validering med @Valid
- Brugerdefinerede validatorer
- @ControllerAdvice og @ExceptionHandler
- Problem Details (RFC 7807)