问题描述
我正在尝试为我的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)