[Spring][Modules] Validator de beans
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 :
Code:
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:
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:
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:
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:
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:
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é...