SpringMVC et la JSR303 (validation)

Suite au billet SpringMVC pour les nuls, nous poursuivons avec l'ajout de la validation à base de la JSR303.

La JSR303 ou Bean Validation offre une API standard qui permet de valider un objet Java et de générer la liste des violations des contraintes non observées.

La gestion de la validation est indépendante de la nature de l'application.

Mais ici la démonstration est produite dans le cadre d'une application web avec SpringMVC.

En effet, dans cette démo, on configure Spring, on ajoute quelques annotations sur les propriétés (les champs), une annotation sur l'objet dans le controller et c'est tout.

Plus précisément, en cinq actes nous allons mettre en place la validation dans notre application web sans écrire du code.

Il est préférable de partir du projet de la seconde partie du billet déjà mentionné.

Il faudrait donc le compléter en suivant les cinq actes ci-après.

Voici donc les cinq actes pour la mise en place de la validation (JSR303):

ACTE 1. Ajouter la dépendance dans le pom

Ajouter le bloc suivant dans le pom du projet:

<dependency>
	<groupId>org.hibernate</groupId>
	<artifactId>hibernate-validator</artifactId>
	<version>4.3.0.Final</version>
</dependency>

Vous constatez que c'est l'implémentation d'hibernate qui est retenue.

ACTE 2. Configurer SpringMVC pour activer la validation

Ajouter dans le fichier applicationContext.xml la ligne suivante:

<!-- JSR-303 support will be detected on classpath 
        and enabled automatically -->
    <mvc:annotation-driven/>

Comme le mentionne le commentaire intégré, ceci permet de détecter dans le classpath tous les POJOs annotés.

La validation est automatiquement enclenchée et les violations des contraintes présentes dans les propriétés (annotées) sont signalées.

Nous verrons plus loin comment récupérer ces signalements.

ACTE 3. Annoter les propriétés

La classe PersonForm est complétée en précisant les contraintes sur attributs via les annotations.

Ces annotations de la JSR303 indiquent les contraintes à respecter pour que le POJO PersonForm soit valide.

public class PersonForm implements Serializable{
 private static final long serialVersionUID = 1L;
 @Size( message="Saisir un nom ayant 3 à 9 car.", min=3,max=9) 
 private String name;
 @Pattern(message="Date incorrecte!",regexp="^[0-9]{2}+\\/+[0-9]{2}+\\/+[0-9]{4}+")
 private String dateBirth;
 
....
}

Toutes ces annotations proviennent de javax.validation.constraints.

L'annotation @Size est explicite. Nous avons indiqué le message qui sera affiché en cas de violation de cette contrainte.

La seconde annotation est @Pattern qui vérifie le regexp passé en attribut.

Dans cet exemple et à titre d'illustration (la roue réinventé ) la regexp matche une chaîne de la forme dd/MM/yyyy.

ACTE 4. Annoter dans le controller l'objet du model

La méthode valider du seul controller PersonController doit être adaptée comme suit:

@RequestMapping(value="/create", method=RequestMethod.POST)
public String valider(@ModelAttribute("person") @Valid PersonForm pf, 
                            BindingResult result, Model mp){

    if(result.hasErrors()) return "view";
    return "success";
}

L'annotation @Valid et la ligne if(result.hasErrors()) sont les deux points importants ici.

L'annotation JSR303, @Valid, est apposée sur l'argument pf de type PersonForm dans la méthode du controller.

Sans cette annotation, la validtaion ne sera pas active.

La classe PersonForm contient des contraintes sur ses propriétés annotées, SpringMVC signale automatiquement les violations dans Bindingresult.

Et c'est via la méthode hasErrors() de cte objet que l'on accède à la liste des violations (erreurs de validation).

Lorsqu'une prorpiété viole les contraintes alors on dirige l'utilisateur vers la même page view.jsp (qui affiche les erreurs comme nous le verrons dans l'acte suivant).

Sinon, on le redirige vers une page success.jsp.

ACTE 5. Afficher les erreurs dans la page jsp

La manière la plus simple d'afficher les messages d'erreurs est d'ajouter dans la page jsp le tag global <form:errors/> :

<form:form ....

 <form:errors/>

.....

On peut aussi spécifier un message d'erreur pour chaque champ non valide en déclarant par exemple :

<form:form  modelAttribute="person" action="create.html">
 <label for="name">Nom:</label>
 <form:input path="name" />
 <form:errors path="name"/>
.....

Il nous reste à tester tout cela avec la commande:

mvn tomcat:run

Puis lancer dans le navigateur l'url localhost:8080/NOM_CONTEXT/person.html

Enfin, saisir des données erronées pour voir les messages d'erreurs s'afficher.

@J'espère que tout est clair.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.