Bonjour.
Contexte : webapp Struts2+Spring2+Acegi / Tomcat 6.0.10 / windows XP
Problème : J'ai une erreur lors de la création d'un bean. Spring me dit que la classe qu'il essaye d'instancier n'implémente pas l'interface voulue. Or cette classe l'implémente.
Eléments :
securityContext.xml
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
 
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<beans default-autowire="autodetect">
...
	<bean id="logoutFilter" class="org.acegisecurity.ui.logout.LogoutFilter">
		<constructor-arg value="/index.action"/>
		<constructor-arg>
			<list>
				<ref bean="rememberMeServices"/>
				<bean class="org.acegisecurity.ui.logout.SecurityContextLogoutHandler"/>
			</list>
		</constructor-arg>
		<property name="filterProcessesUrl" value="/j_acegi_logout"/>
	</bean>
	<bean id="rememberMeServices" class="org.acegisecurity.ui.rememberme.TokenBasedRememberMeServices">
		<property name="userDetailsService">
			<ref bean="userDetailsService"/>
		</property>
		<property name="tokenValiditySeconds">
			<value>2592000</value>
		</property>
		<property name="key">
			<value>totoestuncon</value>
		</property>
		<property name="alwaysRemember">
			<value>false</value>
		</property>
	</bean>
...
</beans>
Erreur
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
 
[main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating instance of bean 'org.acegisecurity.ui.logout.SecurityContextLogoutHandler#d5c0f9' with merged definition [Root bean: class [org.acegisecurity.ui.logout.SecurityContextLogoutHandler]; scope=singleton; abstract=false; lazyInit=false; autowireCandidate=true; autowireMode=4; dependencyCheck=0; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in ServletContext resource [/WEB-INF/securityContext.xml]]
[main] DEBUG org.springframework.beans.CachedIntrospectionResults - Getting BeanInfo for class [org.acegisecurity.ui.logout.SecurityContextLogoutHandler]
[main] DEBUG org.springframework.beans.CachedIntrospectionResults - Caching PropertyDescriptors for class [org.acegisecurity.ui.logout.SecurityContextLogoutHandler]
[main] DEBUG org.springframework.beans.CachedIntrospectionResults - Found bean property 'class' of type [java.lang.Class]
[main] DEBUG org.springframework.beans.CachedIntrospectionResults - Found bean property 'invalidateHttpSession' of type [boolean]
[main] DEBUG org.springframework.core.CollectionFactory - Creating [java.util.LinkedHashMap]
[main] DEBUG org.springframework.core.CollectionFactory - Creating [java.util.LinkedHashSet]
[main] DEBUG org.springframework.core.CollectionFactory - Creating [java.util.LinkedHashMap]
[main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Ignoring constructor [public org.acegisecurity.ui.logout.LogoutFilter(java.lang.String,org.acegisecurity.ui.logout.LogoutHandler[])] of bean 'logoutFilter': org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'logoutFilter' defined in ServletContext resource [/WEB-INF/securityContext.xml]: Unsatisfied dependency expressed through constructor argument with index 1 of type [org.acegisecurity.ui.logout.LogoutHandler[]]: There are 0 beans of type [[Lorg.acegisecurity.ui.logout.LogoutHandler;] available for autowiring: []. There should have been exactly 1 to be able to autowire constructor of bean 'logoutFilter'.
[main] INFO  org.springframework.beans.factory.support.DefaultListableBeanFactory - Destroying singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@1701bdc: defining beans [captchaEngine,captchaService,acegiDataSource,filterChainProxy,logoutFilter,secureChannelProcessor,insecureChannelProcessor,channelDecisionManager,channelProcessingFilter,filterInvocationInterceptor,httpSessionContextIntegrationFilter,rememberMeProcessingFilter,rememberMeServices,authenticationManager,authenticationProvider,userDetailsService,roleVoter,rememberMeAutheticationProvider,accessDecisionManager,authenticationProcessingFilter]; root of factory hierarchy
[main] ERROR org.springframework.web.context.ContextLoader - Context initialization failed
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'logoutFilter' defined in ServletContext resource [/WEB-INF/securityContext.xml]: Unsatisfied dependency expressed through constructor argument with index 1 of type [org.acegisecurity.ui.logout.LogoutHandler[]]: There are 0 beans of type [[Lorg.acegisecurity.ui.logout.LogoutHandler;] available for autowiring: []. There should have been exactly 1 to be able to autowire constructor of bean 'logoutFilter'.
	at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:458)
	at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:140)
...
Cette erreur est répétée 3x.

Or, les classes org.acegisecurity.ui.rememberme.TokenBasedRememberMeServices et org.acegisecurity.ui.logout.SecurityContextLogoutHandler implémentent l'interface org.acegisecurity.ui.logout.LogoutHandler.

Si je commente le bean logoutFilter, tout fonctionne correctement.

Avez-vous une idée de l'origine du problème.

Merci.

PPDL