在Spring Boot中,FindByIndexNameSessionRepository不能为空

问题描述

我正在尝试为我的Spring Security Application实现记住功能。我也使用Redis。我配置了SpringSessionBackedSessionRegistry个bean。但是,当我尝试@Autowired FindByIndexNameSessionRepository时,出现以下错误

由以下原因导致: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);
    }
}

Handler.java

@Component
public class Handler {

    private @Autowired SessionRegistry sessionRegistry;
    private @Autowired FindByIndexNameSessionRepository<? extends Session> 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);
    }
}

我收到类似的错误

由以下原因导致:java.lang.IllegalArgumentException:sessionRepository 不能为空原因: org.springframework.beans.BeanInstantiationException:失败 实例化 [org.springframework.session.security.SpringSessionBackedSessionRegistry]: 涉及包含bean'securityConfig'的循环引用- 考虑将工厂方法声明为静态方法以实现独立于 其包含的实例。工厂方法“ sessionRegistry”被抛出 例外;嵌套的异常是java.lang.IllegalArgumentException: sessionRepository不能为空原因: org.springframework.beans.factory.BeanCreationException:错误 在类路径中创建名称为“ sessionRegistry”的bean 资源[SecurityConfig.class]:通过工厂方法实例化Bean 失败嵌套异常为 org.springframework.beans.BeanInstantiationException:失败 实例化 [org.springframework.session.security.SpringSessionBackedSessionRegistry]: 涉及包含bean'securityConfig'的循环引用- 考虑将工厂方法声明为静态方法以实现独立于 其包含的实例。工厂方法“ sessionRegistry”被抛出 例外;嵌套的异常是java.lang.IllegalArgumentException: sessionRepository不能为空

它也说,

没有'FindByIndexNameSessionRepository 类型 找到。

那么我在这里做错了什么?我该如何解决?有人可以帮助我吗?预先感谢。

解决方法

也许我不确定,因为这个循环依赖错误...

无论如何,问题可能是由于您实际上没有在Spring上下文中注入FindByIndexNameSessionRepository引起的,至少不是您要配置的SessionRepository,而是SessionRepository,因为您正在定义类型RedisSessionRepository的bean,并且此接口实现FindByIndexNameSessionRepository,而不是@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 FindByIndexNameSessionRepository redisSessionRepository(RedisOperations<String,Object> sessionRedisOperations) { return new RedisIndexedSessionRepository(sessionRedisOperations); } } 。请尝试改用RedisIndexedSessionRepository,例如:

.filter_by(user_id=current_user.id)