Spring Boot 4-mikrotjänster och REST API:er · Lektion

Anpassade validatorer

Skriv egna valideringsbegränsningar.

Lektion 2 av 413 steg

Anpassade validatorer är en gratis lektion i Spring Boot 4-mikrotjänster och REST API:er på CoddyKit. Detta är lektion 2 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för Spring Boot 4-mikrotjänster och REST API:er, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Spring Boot 4-mikrotjänster och REST API:er innehåller totalt 4 lektioner.

När inbyggda funktioner inte räcker

Standardbegränsningar kan inte uttrycka alla regler — till exempel ett giltigt format för en kupongkod, ett telefonnummer för en viss region eller ett värde som måste finnas i databasen. För sådana fall skriver du en anpassad begränsning med en validator bakom.

En anpassad begränsning i två delar

En anpassad begränsning består av två delar:

  • En annotation som du placerar på fält eller parametrar
  • En ConstraintValidator som innehåller den faktiska kontrollogiken

Definiera annotationen

Skapa annotationen och koppla den till sin validator med @Constraint. Deklarera standardmedlemmarna message, groups och payload som krävs enligt specifikationen.

@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 {};
}

Implementera ConstraintValidator

Validatorn implementerar ConstraintValidator<Annotation, Type> och skriver över isValid. Returnera true när värdet uppfyller regeln.

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 för null-hantering

En anpassad validator behandlar enligt konvention null som giltigt och överlåter kontrollen av null-värden till @NotNull. Det gör begränsningarna kombinerbara — varje regel har en enda uppgift.

Använda den anpassade begränsningen

Använd din annotation på samma sätt som en inbyggd annotation. Tillsammans med @Valid på controllern deltar den i det vanliga valideringsflödet.

public class CreateUserRequest {
    @NotBlank
    @StrongPassword
    private String password;
}

Anpassade felmeddelanden

I isValid kan du inaktivera standardmeddelandet och lägga till ett kontextuellt meddelande, vilket är användbart när en enda annotation tillämpar flera delregler.

ctx.disableDefaultConstraintViolation();
ctx.buildConstraintViolationWithTemplate(
        "Password must include a digit and an uppercase letter")
   .addConstraintViolation();
return false;

Injicera beans i en validator

En ConstraintValidator är en Spring-bean och kan därför använda konstruktorinjektion — vilket möjliggör regler som hämtar information från ett repository eller en tjänst, till exempel kontroller av unikhet.

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änsningar på klassnivå

Vissa regler omfattar flera fält — "password must equal confirmPassword." Rikta annotationen mot TYPE och validera hela objektet genom att läsa flera fält tillsammans.

@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 {};
}

Initieringskrok

Skriv över initialize för att hämta attribut från annotation-instansen, till exempel en konfigurerbar minsta längd, innan valideringen körs.

@Override
public void initialize(StrongPassword ann) {
    this.minLength = ann.minLength();
}

Håll validatorer rena och snabba

Validatorer körs vid varje request, så håll dem snabba och fria från sidoeffekter när det är möjligt. Databasbaserade kontroller går bra, men de bör vara indexerade och resurssnåla för att inte fördröja hanteringen av requests.

Snabb kontroll

Testa dina kunskaper om anpassade validatorer.

Sammanfattning

Anpassade validatorer utökar Bean Validation.

  • En begränsning består av en @Constraint-annotation och en ConstraintValidator
  • Skriv över isValid; behandla enligt konvention null som giltigt
  • Validatorer är beans och stöder därför konstruktorinjektion
  • Använd begränsningar på klassnivå för regler som omfattar flera fält
  • Anpassa meddelanden via valideringskontexten
Gratis att börja

Lär dig Java med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
24
Lektioner
93

Vanliga frågor

Är lektionen ”Anpassade validatorer” gratis?

Ja – hela texten till ”Anpassade validatorer” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i Spring Boot 4-mikrotjänster och REST API:er, kan Ni uppgradera till CoddyKit PRO. Kursen i Spring Boot 4-mikrotjänster och REST API:er innehåller totalt 4 lektioner.

Vad lär jag mig i ”Anpassade validatorer”?

Skriv egna valideringsbegränsningar. Ni övar på Spring Boot 4-mikrotjänster och REST API:er med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig Spring Boot 4-mikrotjänster och REST API:er?

Du behöver inga förkunskaper. Utbildningen i Spring Boot 4-mikrotjänster och REST API:er på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 2 av 4.

Hur lång tid tar lektionen ”Anpassade validatorer”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här Spring Boot 4-mikrotjänster och REST API:er-lektionen?

Ja. Varje Spring Boot 4-mikrotjänster och REST API:er-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Bean-validering med @Valid
  2. Anpassade validatorer
  3. @ControllerAdvice och @ExceptionHandler
  4. Problemdetaljer (RFC 7807)
← Tillbaka till Spring Boot 4-mikrotjänster och REST API:er