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 Java Discussion :

[Spring][Modules] Validator de beans


Sujet :

Spring Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 870
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 870
    Par défaut [Spring][Modules] Validator de beans
    Bonjour tout le monde,

    Voici ce que je cherche à faire :

    1. Créer une classe qui intercèpte tous les appels de méthodes d'une liste de beans définies
    2. Utiliser le Validator de Spring ( disponible dans le package spring modules ) afin de valider les beans passés en paramètres à ces méthodes


    Le premier point fonctionne, et voici comment je m'y suis prit :

    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
    	<bean id="validatorAutoProxyBean" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
    		<property name="beanNames">
    			<list>
    				<value>*WSBean</value>
    			</list>
    		</property>
    		<property name="interceptorNames">
    			<list>
    				<value>validatorInterceptorBean</value>
    			</list>
    		</property>
    	</bean>
     
    	<bean id="validatorInterceptorBean" class="monpackage.ValidatorInterceptor">
    		<property name="beanValidator" ref="beanValidator" />
    	</bean>
    Ceci a pour effet d'intercepter toutes les méthodes des beans définies dans le contexte spring avec un nom finissant par "WSBean".

    Ensuite, voici la définition de mon Validator :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        <bean id="beanValidator" class="org.springmodules.validation.bean.BeanValidator">
            <property name="configurationLoader" ref="configurationLoader"/>
        </bean>
     
        <bean id="configurationLoader" class="org.springmodules.validation.bean.conf.loader.xml.DefaultXmlBeanValidationConfigurationLoader">
            <property name="resource" value="classpath:validation.xml"/>
        </bean>
    Ce validator a été injecté à ma classe qui intercèpte les appels.

    Voici la configuration validation.xml associée :

    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
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <validation xmlns="http://www.springmodules.org/validation/bean"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xsi:noNamespaceSchemaLocation="validation.xsd">
     
        <class name="monpackage.MonBean">
     
            <property name="email">
                <length min="7" max="7"/>
                <not-blank />
            </property>
     
        </class>
     
    </validation>
    Le but de cette validation simple est de lancer une exception lorsqu'on passe un bean de type "MonBean" avec un champ "email" qui ne ferait pas exactement 7 caractères ( c'est juste un exemple ).

    Voici finalement ma classe qui intercèpte les appels de méthode :

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    package monpackage;
     
    import org.aopalliance.intercept.MethodInterceptor;
    import org.aopalliance.intercept.MethodInvocation;
    import org.springframework.validation.BindException;
    import org.springframework.validation.Errors;
    import org.springmodules.validation.bean.BeanValidator;
     
    import monpackage.Commonclass;
     
    public class ValidatorInterceptor extends Commonclass implements MethodInterceptor {
     
    	private BeanValidator beanValidator;
     
    	public Object invoke(MethodInvocation invocation) throws Throwable {
     
    		log.debug("ValidatorInterceptor invoked : " + invocation.getMethod().getName());
     
    		Object[] arguments = invocation.getArguments();
     
    		Errors errors = new BindException(this, "monpackage.MonBean");
     
    		for (int i = 0; i < arguments.length; i++) {
    			beanValidator.validate(arguments[i], errors);
    		}
     
    		Object out = (Object) invocation.proceed();
    		return out;
    	}
     
    	public BeanValidator getBeanValidator() {
    		return beanValidator;
    	}
     
    	public void setBeanValidator(BeanValidator beanValidator) {
    		this.beanValidator = beanValidator;
    	}
     
    }
    Mais il doit y avoir quelque chose que je ne comprend pas avec mes Errors..
    Dans la console, on peut lire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    2007-07-27 17:58:24,093 DEBUG monpackage.ValidatorInterceptor - ValidatorInterceptor.java:17 - ValidatorInterceptor invoked : uneMethode
    2007-07-27 17:58:24,093 DEBUG org.springmodules.validation.bean.BeanValidator - BeanValidator.java:156 - Validating object in path ''
    2007-07-27 17:58:24,093 DEBUG org.springmodules.validation.bean.BeanValidator - BeanValidator.java:329 - Validating global rules...
    2007-07-27 17:58:24,093 DEBUG org.springmodules.validation.bean.BeanValidator - BeanValidator.java:334 - Validating properties rules...
    2007-07-27 17:58:24,109 DEBUG org.springmodules.validation.bean.BeanValidator - BeanValidator.java:391 - Validating property 'email' rules...
    2007-07-27 17:58:24,109 DEBUG org.springmodules.validation.bean.BeanValidator - BeanValidator.java:339 - Executing custom validator...
    Donc j'intercèpte bien, mais on dirait que ça ne valide pas bien.

    Quelqu'un aurait une idée du pourquoi du comment ça ne marche pas, ou de ce que je fais de travers ?

    Merci d'avance !

    PS :
    Suite à une question de Hikage, voici un ajout faite à ma classe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    		for(Iterator i = errors.getAllErrors().iterator() ; i.hasNext(); ) {
     
    			  Error err = (Error) i.next();
    			  log.debug(err.toString());
     
    			}
    Mais rien n'est loggé...

  2. #2
    Rédacteur
    Avatar de Hikage
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 177
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 177
    Par défaut
    Et un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     log.debug("Nombre d'erreurs : " + errors.getAllErrors().size);
    Parce que si error est vide, c'est qu'a premiere vue tes règles de validations ne sont pas violées.

    J'ai jamais utilise un validateur via fichier XML, donc je ne peux pas te dire si ilest correct en soit.


    D'un autre coté, tu défini :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Errors errors = new BindException(this, "monpackage.MonBean");
    Mais a part dans le validate, ce n'est utilise nulle part..

    Si le validateur fonctionne comme je le pense, il ne sert qu'a ajoute des "erreur" dans l'object Errors ( qui contient une liste d'erreur ).
    Aucune exception ne sera levée.

    Dans le cadre de Spring MVC ( seul cadre ou j'ai utilisé des validateurs ), l'objet Errors sera rempli.
    Mais ce même objet sera utilisée pour vérifier qu'aucune erreur n'est présente, le cas contraire il ré affiche la page du formulaire avec les informations sur ces erreurs.

    Dans ton cas, je présume qu'il faudra vérifier toit même si aucune erreur n'est créée, et lever une exception le cas contraire.

    Cela dit, cela n'explique pas pourquoi l'object Errors est vide ..
    Hikage
    SCJP / SCWCD & SCWSJD Certified / Spring Framework Certified
    [Personal Web] [CV]

    F.A.Q Spring Framework - Participez !

  3. #3
    Membre Expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 870
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 870
    Par défaut
    Salut Hikage,

    Merci pour ta réponse !

    En fait j'ai passé un objet Errors à la méthode validate car elle a besoin d'un objet de ce type, de plus il faut que cet objet soit non null !

    De plus je suis passé en mode debug dans le code du validateur, et à priori on dirait qu'il ne repère pas les règles que j'ai mise, enfin elles sont présentes au runtime dans l'objet, mais pas utilisée...

    Je vais chercher encore un peu, merci pour ton aide en tout cas !

    Si tu as une autre idée, ou si quelqu'un d'autre a une idée, je suis tout ouïe..

    A+

    PS : size() = 0

  4. #4
    Membre Expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 870
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 870
    Par défaut
    C'est bon j'ai trouvé, en fait ma configuration était bonne, sauf que j'avais modifié des choses dans mes web services qui ont fait que mes appels via SOAP UI n'étaient plus pris en compte et bizarrement ne sortaient pas en erreur..

    Pourtant j'avais fait un "update" sur mes projets SOAP UI, et ça n'a rien fait, j'ai effacé mes projets SOAP UI et je les ai recrée, et ça déclenche bien la validation Merci pour ton aide!

    A+

  5. #5
    Rédacteur
    Avatar de Hikage
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 177
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 177
    Par défaut
    Cool ! Un petit tag résolu ? ;-)
    Hikage
    SCJP / SCWCD & SCWSJD Certified / Spring Framework Certified
    [Personal Web] [CV]

    F.A.Q Spring Framework - Participez !

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

Discussions similaires

  1. Spring MVC Validation
    Par MASSAKA dans le forum Spring Web
    Réponses: 0
    Dernier message: 08/12/2008, 12h48
  2. [Spring MVC] validation.xml coté client
    Par Tail dans le forum Spring Web
    Réponses: 1
    Dernier message: 28/10/2006, 17h46
  3. Réponses: 12
    Dernier message: 24/05/2006, 15h37
  4. [Spring MVC][Validator] Ne stop pas si il y a une erreurs
    Par Hikage dans le forum Spring Web
    Réponses: 3
    Dernier message: 15/02/2006, 09h43

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