简体   繁体   中英

Spring security : Cannot resolve reference to bean while setting constructor argument

I am implementing Remember me in spring security.And here is my configuration

<bean id="rememberMeServices"
          class="com.spring.security.service.WMPersistentTokenBasedRememberMeServices">
        <constructor-arg name="userDetailsService" ref="loginService"/>
        <property name="tokenValiditySeconds" value="300"></property>
 </bean>


<security:http auto-config="false" use-expressions="true" entry-point-ref="appAuthenticationEntryPoint">
        <!-- Interceptor urls -->
        <security:remember-me user-service-ref="#{rememberMeServices.getUserDetailsServiceInstance()}" token-repository-ref="#{rememberMeServices.getTokenRepository()}" />
</security:http>

And my WMPersistentTokenBasedRememberMeServices looks like

public class WMPersistentTokenBasedRememberMeServices extends PersistentTokenBasedRememberMeServices {

    private static final String key = "WM_APP_KEY";

    private static final PersistentTokenRepository tokenRepository = new InMemoryTokenRepositoryImpl();

    public WMPersistentTokenBasedRememberMeServices(UserDetailsService userDetailsService) {
        super(key, userDetailsService, tokenRepository);
    }

    public PersistentTokenRepository getTokenRepository() {
        return tokenRepository;
    }

    public UserDetailsService getUserDetailsServiceInstance()
    {
        return getUserDetailsService();
    }
} 

But When I deploy application with above configuratio,I am getter below error

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#61fc8560': Cannot resolve reference to bean 'org.springframework.security.web.authentication.rememberme.PersistentTokenBasedRememberMeServices#0' while setting bean property 'logoutHandlers' with key [0]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.security.web.authentication.rememberme.PersistentTokenBasedRememberMeServices#0': Cannot resolve reference to bean '#{rememberMeServices.getTokenRepository()}' while setting constructor argument; nested exception is org.springframework.beans.factory.NoSuchBeanDefinition
Exception: No bean named 'org.springframework.security.web.authentication.rememberme.InMemoryTokenRepositoryImpl@2a13c5e' is defined


Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.security.web.authentication.rememberme.PersistentTokenBasedRememberMeServices#0': Cannot resolve reference to bean '#{rememberMeServices.getTokenRepository()}' while setting constructor argument; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'org.springframework.security.web.authentication.rememberme.InMemoryTokenRepositoryImpl@2a13c5e' is defined

When I remove using spring expression language in

 <security:remember-me ...>

tag and provide valid user ref instance,it is working fine.

But when I use spring expression language it is failing with above error.I doubt with ordering of bean creation.

Any one having Idea about this error ?

The error message says everything :

Exception: No bean named 'org.springframework.security.web.authentication.rememberme.InMemoryTokenRepositoryImpl@2a13c5e' is defined

The token repository is not a bean. Indeed, if you look at your code, the TokenRepository is a static field. Instead of using a static field, declare it as a bean: in your xml config, add something like :

<bean id="tokenRepository"
      class="org.springframework.security.web.authentication.rememberme.InMemoryTokenRepositoryImpl"/>

and replace the static field with something like :

@Autowired
private PersistentTokenRepository tokenRepository;

Spring, as a dependency injection framework , provides useful mechanisms to avoid usage of static reference: just use those mechanisms.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM