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é...