【问题标题】:Spring security : Cannot resolve reference to bean while setting constructor argumentSpring security:设置构造函数参数时无法解析对bean的引用
【发布时间】:2016-01-09 12:26:51
【问题描述】:

我正在 Spring Security 中实现记住我。这是我的配置

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

我的 WMPersistentTokenBasedRememberMeServices 看起来像

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();
    }
} 

但是当我使用上述配置部署应用程序时,我得到以下错误

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

当我在

中使用 spring 表达式语言删除时
 <security:remember-me ...>

标记并提供有效的用户引用实例,它工作正常。

但是当我使用 spring 表达式语言时,它会因上述错误而失败。我怀疑 bean 创建的顺序。

任何人对此错误有想法?

【问题讨论】:

    标签: java spring spring-security spring-bean


    【解决方案1】:

    错误信息说明了一切:

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

    令牌存储库不是 bean。事实上,如果您查看您的代码,TokenRepository 是一个静态字段。不要使用静态字段,而是将其声明为 bean:在您的 xml 配置中,添加类似:

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

    并用类似的东西替换静态字段:

    @Autowired
    private PersistentTokenRepository tokenRepository;
    

    Spring,作为一个依赖注入框架,提供了有用的机制来避免使用静态引用:只需使用这些机制。

    【讨论】:

    • 即使按照您的建议进行了更改,我仍然收到错误。在设置构造函数参数时无法解析对 bean '#{rememberMeServices.getTokenRepository()}' 的引用;嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException:没有名为 'org.springframework.security.web.authentication.rememberme.InMemoryTokenRepositoryImpl@4d19bf23' 的 bean。 Beans 的创建和自动装配都很好。我唯一担心的是表达式语言没有在 spring 安全标签中解析。
    猜你喜欢
    • 2019-04-07
    • 2018-08-06
    • 2017-06-30
    • 1970-01-01
    • 2014-05-09
    • 1970-01-01
    • 2021-03-10
    • 1970-01-01
    • 2022-12-18
    相关资源
    最近更新 更多