Java 在Spring引导中,FindByIndexNameSessionRepository不能为null

Java 在Spring引导中,FindByIndexNameSessionRepository不能为null,java,spring-boot,redis,spring-data-redis,spring-session,Java,Spring Boot,Redis,Spring Data Redis,Spring Session,我正在尝试为我的Spring安全应用程序实现记住函数。我也用了Redis。我配置了,SpringSessionBackedSessionRegistrybean。但是当我尝试@Autowired查找DbyIndexNameSessionRepository时,我得到了以下错误: 原因:java.lang.IllegalArgumentException:sessionRepository 不能为空 代码如下: @Configuration @EnableWebSecurity public cl

我正在尝试为我的Spring安全应用程序实现记住函数。我也用了Redis。我配置了,
SpringSessionBackedSessionRegistry
bean。但是当我尝试
@Autowired
查找DbyIndexNameSessionRepository
时,我得到了以下错误:

原因:java.lang.IllegalArgumentException:sessionRepository 不能为空

代码如下:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private FindByIndexNameSessionRepository<? extends Session> sessionRepository;
    
    @Bean
    public SpringSessionBackedSessionRegistry sessionRegistry() {
        return new SpringSessionBackedSessionRegistry(this.sessionRepository);
    }
}
和Redis会话配置

@Configuration
@EnableSpringHttpSession
public class SessionConfig {

    private final RedisConnectionFactory redisConnectionFactory;

    public SessionConfig(ObjectProvider<RedisConnectionFactory> redisConnectionFactory) {
        this.redisConnectionFactory = redisConnectionFactory.getIfAvailable();
    }
    
    @Bean
    public RedisOperations<String, Object> sessionRedisOperations() {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(this.redisConnectionFactory);
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        return redisTemplate;
    }

    @Bean
    public RedisSessionRepository redisSessionRepository(RedisOperations<String, Object> sessionRedisOperations) {
        return new RedisSessionRepository(sessionRedisOperations);
    }
}
@配置
@启用SpringHttpSession
公共类会话配置{
私有最终重新连接工厂重新连接工厂;
公共会话配置(ObjectProvider redisConnectionFactory){
this.redisConnectionFactory=redisConnectionFactory.getIfAvailable();
}
@豆子
公共RedisOperations会话RedisOperations(){
RedisTemplate RedisTemplate=新RedisTemplate();
redisTemplate.setConnectionFactory(this.redisConnectionFactory);
setKeySerializer(新的StringRedisSerializer());
setHashKeySerializer(新的StringRedisSerializer());
返回模板;
}
@豆子
公共RedisSessionRepository RedisSessionRepository(RedisOperations sessionRedisOperations){
返回新的RedisSessionRepository(sessionRedisOperations);
}
}
我会犯这样的错误

原因:java.lang.IllegalArgumentException:sessionRepository 不能为null,原因是: org.springframework.beans.BeanInstantiationException:未能 实例化 [org.springframework.session.security.SpringSessionBackedSessionRegistry]: 包含bean“securityConfig”的循环引用- 考虑将工厂方法声明为独立的静态方法。 它的包含实例。已引发工厂方法“sessionRegistry” 例外情况;嵌套异常为java.lang.IllegalArgumentException: sessionRepository不能为null,原因是: org.springframework.beans.factory.BeanCreationException:错误 创建在类路径中定义了名为“sessionRegistry”的bean resource[SecurityConfig.class]:通过工厂方法进行Bean实例化 失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:未能 实例化 [org.springframework.session.security.SpringSessionBackedSessionRegistry]: 包含bean“securityConfig”的循环引用- 考虑将工厂方法声明为独立的静态方法。 它的包含实例。已引发工厂方法“sessionRegistry” 例外情况;嵌套异常为java.lang.IllegalArgumentException: sessionRepository不能为null

还说,


“FindByIndexNameSessionRepository可能没有bean,我不确定,因为这个循环依赖项错误

在任何情况下,问题都可能发生,因为您实际上没有在Spring上下文中注入
FindByIndexNameSessionRepository
,至少不是您试图配置的,而是
SessionRepository
,因为您正在定义类型为的bean,并且此接口实现的是
SessionRepository
,而不是
FindByIndexNameSessionRepository
。请尝试改用a,例如:

@配置
@启用SpringHttpSession
公共类会话配置{
私有最终重新连接工厂重新连接工厂;
公共会话配置(ObjectProvider redisConnectionFactory){
this.redisConnectionFactory=redisConnectionFactory.getIfAvailable();
}
@豆子
公共RedisOperations会话RedisOperations(){
RedisTemplate RedisTemplate=新RedisTemplate();
redisTemplate.setConnectionFactory(this.redisConnectionFactory);
setKeySerializer(新的StringRedisSerializer());
setHashKeySerializer(新的StringRedisSerializer());
返回模板;
}
@豆子
公共FindByIndexNameSessionRepository RedisessionRepository(RedisOperations sessionRedisOperations){
返回新的RedisIndexedSessionRepository(sessionRedisOperations);
}
}

也许这个问题可以帮助你:?@jccampanero我检查了它,我把
@EnableRedisHttpSession
放进去了,但是没有用。一直说
sessionRepository不能为null
我明白了。。。堆栈跟踪表明配置中存在某种循环依赖关系。请,您可以从您的类中删除
@EnableWebSecurity
?只需使用
@配置
注释即可。有可能是其他配置干扰了您的类。@jccampanero我删除了
@EnableWebSecurity
,但仍然得到相同的错误。我已经更新了这个问题,并将
Handler.java
和Redis
SessionConfig.java
类放在一起。请你也检查一下好吗?它还说没有为
FindByIndexNameSessionRepository
type找到bean。非常感谢您更新这个问题。我贴出了一个可能的答案。先生,您能试试吗?非常感谢您花时间和精力来解决这个问题。我真的很感激。我这样做了,但现在我得到了一个错误,说这是两个bean RedisessionRepository和sessionRepository。我甚至对redisSessionRepository发表了评论,但没有成功?先生,有没有其他方法为
FindByIndexNameSessionRepository
创建bean?请查看我的更新答案。您只需要定义一个bean,而不是两个。你能试试吗?你有什么错误吗?我现在就离开,但是请你发表任何你认为合适的评论,我会试着去评论它。asap@HAthukorala你在解决问题方面有什么进展吗?不客气@Hathukarala,谢谢。我很高兴听到你终于解决了你的问题。
@Configuration
@EnableSpringHttpSession
public class SessionConfig {

    private final RedisConnectionFactory redisConnectionFactory;

    public SessionConfig(ObjectProvider<RedisConnectionFactory> redisConnectionFactory) {
        this.redisConnectionFactory = redisConnectionFactory.getIfAvailable();
    }
    
    @Bean
    public RedisOperations<String, Object> sessionRedisOperations() {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(this.redisConnectionFactory);
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        return redisTemplate;
    }

    @Bean
    public RedisSessionRepository redisSessionRepository(RedisOperations<String, Object> sessionRedisOperations) {
        return new RedisSessionRepository(sessionRedisOperations);
    }
}