IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Spring Web Java Discussion :

Validation d'un objet [MVC]


Sujet :

Spring Web Java

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    691
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 691
    Par défaut Validation d'un objet
    Bonjour,

    J'essaye de valider un objet construit à partir de données en BDD.
    Cet objet est en fait une compilation d'objet formulaire posté ultérieurement.

    Je voudrais en fait valider cet objet sans le poster, l'objet étant construit au chargement de la page, et redirigé en cas d'erreur vers une page spécifique avec la liste des erreurs.
    Pour plus de facilité j'essaye d'utiliser l'implements validator (sans trop de succes pour l'instant)

    Ma question est
    Est-ce possible?
    Et comment regrouper les erreurs des différents formulaire.

  2. #2
    Membre chevronné Avatar de Drakiss
    Homme Profil pro
    Consultant MOE
    Inscrit en
    Octobre 2010
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Consultant MOE
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2010
    Messages : 185
    Par défaut
    Si j'ai bien compris, ça peut se résoudre par une validation de formulaires multiples.
    La question est de savoir :
    Si tu utilise la base de donnée pour initialiser les formulaires, d'après ce que j'ai compris, pourquoi tu ne fait pas une méthode dans la classe appelée avant pour valider, puis comparer aux données des différents formulaires ?
    Mais j'ai peut-être mal compris...
    Jette un coup d'oeil à ça :
    http://myfaces.apache.org/tomahawk-p...t_subform.html si jsf ne te fait pas peur.

    Sinon la partie sur les Contrôleur de gestion de formulaire semble intéressante à la page 226 par là :
    http://www.springparlapratique.org/e...pv2-chap-7.pdf

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    691
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 691
    Par défaut
    En fait ma page ne contient aucun formulaire à proprement parlée.

    Je veux juste valider un objet que je charge dans mon controller depuis la base de donnée comme si c'était un formulaire.

    Et si y a des erreurs je veux les afficher grace à la balise formulaire d'erreur de spring mvc et sinon afficher une page simple.

    Donc pour l'instant j'arrive à valider l'objet.
    Ce que je n'arrive pas à faire c'est afficher les erreurs.

    voici le code du controller :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    CollecteInternet vFormulaire6EForm = (CollecteInternet) getInBDD();
     
    DataBinder vResult = new DataBinder(vFormulaire6EForm, "collecteInternet");
     
    Demande6EValidator vDemandeValidator = new Demande6EValidator();
    vDemandeValidator.validate(vFormulaire6EForm, vResult.getBindingResult());
     
    		// TODO valider les champs obligatoire avant soumission
    		if (vResult.getBindingResult().hasErrors()) {
    			pModel.addAttribute("collecteInternet", vFormulaire6EForm);
    			pModel.addAttribute(vFormulaire6EForm);
    			pModel.addAttribute(vResult.getBindingResult());
    			pModel.addAttribute(vResult);
    			return ConstantesFormulaire6E.URL_COLLECTE_CHAMPS_OBLIGATOIRE;
    		}
    PS : tout les pModel c'etait pour tester mais ca n'affiche quand meme pas les erreurs dans la JSP

  4. #4
    Membre chevronné Avatar de Drakiss
    Homme Profil pro
    Consultant MOE
    Inscrit en
    Octobre 2010
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Consultant MOE
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2010
    Messages : 185
    Par défaut
    Bonjour, que fais-tu au niveau de la déclaration du bean Controlleur dans le servlet.xml ?
    Et est-ce que ta page jsp utilise bien la balise <form:form> pour que le Binding formulaire / objet Command soit bidirectionnel car apparement on peut avoir le contrôle complet de la validation métiers complexes en utilisant le Validator.
    (cf : ce Tutoriel-ci !).
    Je viens de trouver un bout de code d'un mec qui passe par des interceptor pour construire son binding et valider ses objets qui peut t'intéresser sur le site officiel de spring !
    Après il te reste à tester en debug/firebug ce qui se passe et pourquoi ça ne passe pas...
    N'étant pas spécialiste...
    Bon courage.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    691
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 691
    Par défaut
    Comme je le disais il n'y a pas de POST de formulaire juste l'affichage des erreurs générés par un Validator que j'utilise dans un Controller GET

    Voici ma page d'affichage JSP :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <div class="espace_gauche">
    	<form:form modelAttribute="collecteInternet">
    		<div class="champ_erreur"><form:errors path="*" /></div>
    		<div class="champ_erreur"><form:errors path="chantierForm.*" /></div>
    		<div class="champ_erreur"><form:errors path="demandeurForm.*" /></div>
    		<div class="champ_erreur"><form:errors path="auForm.*" /></div>
    		<div class="champ_erreur"><form:errors path="precisionTechniqueForm.*" /></div>
    	</form:form>
    </div>

  6. #6
    Membre chevronné Avatar de Drakiss
    Homme Profil pro
    Consultant MOE
    Inscrit en
    Octobre 2010
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Consultant MOE
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2010
    Messages : 185
    Par défaut
    Je ne sait pas si ça vient de là, et suis en mode test, mais est-ce que tu as testé avec des input (hidden, evidement le but n'étant pas que quelqun remplisse le formulaire ?), mais ça parait idiot puisque le path est le même par contre avec commandName, et donner explicitement le nom de l'objet (vérifier les majuscules) dans le form ?
    Après avec une pirouette, tu pourrais faire un POST du formulaire au premier passage, et afficher les erreurs au second, mais c'est pas forcement joli, joli...
    Je crois qu'il te reste des tests à faire, désolé pour ce manque de réponses concrètes

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    691
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 691
    Par défaut
    Si je dois en faire un formulaire il y a plus de 100champs !
    Autant te dire que c'est pas possible

    D'ou la validation sans post mais par récupération des données dans le formulaire.

    Ce que je ne comprends pas c'est comment est fait le lien entre les erreurs générées pas le validator et les balise <form;errors>

    Parcque mon validator valide bien j'ai bien la liste des erreurs dans le bindingResult, mais impossible de les afficher.

    Mais comment ca marche lors des POST .....

    Merci de m'aider en tout cas

  8. #8
    Membre chevronné Avatar de Drakiss
    Homme Profil pro
    Consultant MOE
    Inscrit en
    Octobre 2010
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Consultant MOE
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2010
    Messages : 185
    Par défaut
    Quelle version de Spring utilise-tu ?
    A ta place j'essayerai quand même de mettre commandName dans le <form:form commandName="collecteInternet"> même si cela semble être une manière similaire de faire.

    le lien entre les erreurs générées par le validator et la balise <form> est faite de toute façon par le nom de la classe avec la première lettre en minuscule.

    Voici un exemple de code pour utiliser le commandName="command" (mettre le nom approprié)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public void form(Command command, BindingResult bindingResult) {
        if(validator.validate(command, bindingResult)) {
            // erreur
        } else {
            // ok
        }
    Voici un exemple de code pour utiliser modelAttribute :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public void form(@ModelAttribute("command") Command command, BindingResult bindingResult) {
        // même code qu'au dessus
    }
    Ensuite, tu pourrais essayer avec du jstl d'afficher les champs du style :
    <c:if test="${not empty requestScope['org.springframework.validation.BindingResult.<COMMAND_NAME_GOES_HERE>'].allErrors}">
    Une erreur s'est produite
    </c:if>
    En supposant que c'est dans le scope request...

    De toute façon, si tu as les erreurs dans le bindingResult, tu doit pouvoir les afficher, y'a pas de raison...

    Ôte moi aussi un doute, c'est pas des listes tes champs ?

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    691
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 691
    Par défaut
    En fait Drakiss t'as pas compris, je ne fait pas de POST

    Je ne peux donc pas mettre "BindingResult bindingResult" dans mes paramètres de fonction puisque je suis en GET.
    Je le créé donc à la main.

    Si je le met dans la signature j'ai cette erreur qui est logique :
    nested exception is java.lang.IllegalStateException: Errors/BindingResult argument declared without preceding model attribute. Check your handler method signature!
    Et si je met @ModelAttribute("command") Command command dans le début (en changeant les noms qui vont bien, il me pette une erreur pas de constructeur par defaut !

    Mes champs ne sont pas des listes et je suis en spring 3.0

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    691
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 691
    Par défaut
    Pour ceux que ca interesse j'ai enfin trouvé la solution qui tient dans une petite ligne de code que je ne comprenais pas

    pModel.addAllAttributes(vResult.getBindingResult().getModel());

    Ce qui donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    @RequestMapping(value = "fin/{pIdDemande}", method = RequestMethod.GET)
    	public String fin(HttpSession pSession, Model pModel, @PathVariable String pIdDemande) throws RemotePracException {
    		CollecteInternet vFormulaire6EForm = (CollecteInternet) getDemandeComplete(pIdDemande, ConstantesDemande.DEMANDE_6E_TYPE_COLLECTE);
     
    		DataBinder vResult = new DataBinder(vFormulaire6EForm, "collecteInternet");
     
    		Demande6EValidator vDemandeValidator = new Demande6EValidator();
    		vDemandeValidator.validate(vFormulaire6EForm, vResult.getBindingResult());
     
    		// TODO valider les champs obligatoire avant soumission
    		if (vResult.getBindingResult().hasErrors()) {
    			pModel.addAllAttributes(vResult.getBindingResult().getModel());
    			return ConstantesFormulaire6E.URL_COLLECTE_CHAMPS_OBLIGATOIRE;
    		}
    et pour l'affichage:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <form:form modelAttribute="collecteInternet" method="POST">
    		<div class="champ_erreur"><form:errors path="chantierForm.*" /></div>
    		<div class="champ_erreur"><form:errors path="demandeurForm.*" /></div>
    		<div class="champ_erreur"><form:errors path="auForm.*" /></div>
    		<div class="champ_erreur"><form:errors path="precisionTechniqueForm.*" /></div>
    	</form:form>

  11. #11
    Membre chevronné Avatar de Drakiss
    Homme Profil pro
    Consultant MOE
    Inscrit en
    Octobre 2010
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Consultant MOE
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2010
    Messages : 185
    Par défaut
    yes, content pour toi, même si j'ai pas servi à grand chose à part te soutenir et en espérant que ça aide d'autres effectivement...
    Va bien falloir que je m'y mette à Spring un de ces jours, moi...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 05/02/2015, 18h21
  2. Validation d'un objet
    Par sybaris dans le forum Windows Forms
    Réponses: 3
    Dernier message: 21/07/2008, 00h46
  3. Comment trouver la dernière date valide pour un objet
    Par DidierC dans le forum Langage SQL
    Réponses: 2
    Dernier message: 08/02/2008, 14h36
  4. Réponses: 8
    Dernier message: 22/05/2006, 10h25
  5. validation formulaire :"objet attendu" pour onSubm
    Par linou dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 15/11/2005, 17h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo