Développement

Personnaliser votre validateur pour Spring boot

Apprenez à créer un validateur personnalisé dans Spring Boot pour garantir la conformité des données en API. Dans cet article, découvrez les étapes pour mettre un place un validateur efficace et réutilisable.

Par

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

Les autres articles à explorer