Java 在Spring引导中,FindByIndexNameSessionRepository不能为null
我正在尝试为我的Spring安全应用程序实现记住函数。我也用了Redis。我配置了,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
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
和RedisSessionConfig.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);
}
}