Intro
Créer un validateur personnalisé dans Spring Boot permet d'assurer que les données envoyées à votre API respectent des règles spécifiques. Dans cet article, nous allons voir les différentes étapes pour mettre en place un validateur efficace et réutilisable.
Comment créer son propre validateur ?
Vous pouvez vérifier un DTO en entrée avec certains validateurs par Jakarta.
Comme par exemple : Positive
, NotNull
.
Mais parfois, vous devez créer votre propre validateur.
Par exemple, j’ai une API pour enregistrer et obtenir une liste de films. Cependant, je ne peux pas sauvegarder un film avec un pays autre que la France ou les Etats-Unis.
L’annotation IsGoodCountry
n’existe pas, vous devez donc en faire une.
Pour cela, vous avez deux possibilités :
Vous n’avez besoin de cette vérification que dans une seule classe, vous pouvez alors créer une méthode dans isFranceOrUsa
avec l’annotation assertTrue
:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class MoviePresenterDto {
private String name;
private String comment;
private Instant creationDate;
private String category;
private String country;
private Float price;
@AssertTrue(message = "Country must be France or Usa.")
private boolean isFranceOrIsUsa(){
return country == null ||
"France".equalsIgnoreCase(country) || "USA".equalsIgnoreCase(country);
}
}
Si vous devez utiliser cette validation dans d’autres classes, vous pouvez rendre une annotation réutilisable :
- Faite une annotation
@Documented
@Constraint(validatedBy = ...)
@Target({ ElementType.METHOD, ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
public @interface IsGoodCountryConstraint {
String message() default "Country must be France or Usa.";
Class<?> groups() default {};
Class<? extends Payload>[] payload() default {};
}
- Ecrivez une classe de validation : (elle est liée à l’annotation
constraint
)
public class IsGoodCountryValidator implements ConstrainValidator<IsGoodCountryConstraint, String> {
@Override
public void initialize(IsGoodCountryConstraint country){
}
@Override
public boolean isValid(String country, ConstraintValidatorContext constraintValidatorContext){
return country == null ||
"France".equalsIgnoreCase(country) || "USA".equalsIgnoreCase(country);
}
}
- Ecrivez le nom de la classe du validateur dans
validatedBy
:
Liez l’annotation à la classe de validation :
@Documented
@Constraint(validatedBy = IsGoodCountryValidator.class)
@Target({ ElementType.METHOD, ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
public @interface IsGoodCountryConstraint {
String message() default "Country must be France or Usa.";
Class<?> groups() default {};
Class<? extends Payload>[] payload() default {};
}
- Ecrivez votre balise d’annotation personnalisée dans le champ où vous voulez vérifier la valeur.
@Data
@AllArgsConstructor
@NoArgsConstructor
public class MoviePresenterDto {
private String name;
private String comment;
private Instant creationDate;
private String category;
@IsGoodCountryConstraint
private String country;
private Float price;
}