Bonjour tout le monde,
Voici ce que je cherche à faire :
- Créer une classe qui intercèpte tous les appels de méthodes d'une liste de beans définies
- 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 :
Ceci a pour effet d'intercepter toutes les méthodes des beans définies dans le contexte spring avec un nom finissant par "WSBean".
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>
Ensuite, voici la définition de mon Validator :
Ce validator a été injecté à ma classe qui intercèpte les appels.
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>
Voici la configuration validation.xml associée :
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 ).
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>
Voici finalement ma classe qui intercèpte les appels de méthode :
Mais il doit y avoir quelque chose que je ne comprend pas avec mes Errors..
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; } }
Dans la console, on peut lire ceci :
Donc j'intercèpte bien, mais on dirait que ça ne valide pas bien.
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...
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 :
Mais rien n'est loggé...
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()); }
Partager