【发布时间】:2021-02-23 22:01:39
【问题描述】:
我正在尝试为我的 Spring Security 应用程序实现记忆功能。我也使用了 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 不能为 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 资源 [SecurityConfig.class]:通过工厂方法实例化 Bean 失败的;嵌套异常是 org.springframework.beans.BeanInstantiationException:失败 实例化 [org.springframework.session.security.SpringSessionBackedSessionRegistry]: 涉及包含 bean 'securityConfig' 的循环引用 - 考虑将工厂方法声明为静态以独立于 它的包含实例。工厂方法“sessionRegistry”抛出 例外;嵌套异常是 java.lang.IllegalArgumentException: sessionRepository 不能为空
它还说,
没有 'FindByIndexNameSessionRepository'类型 找到了。
那么我在这里做错了什么?
【问题讨论】:
-
也许这个问题可以帮到你:stackoverflow.com/questions/51347043/…?
-
@jccampanero 我检查了它并输入了
@EnableRedisHttpSession,但没有用。继续说sessionRepository cannot be null -
我明白了...堆栈跟踪表明您的配置中存在某种循环依赖。拜托,你能把
@EnableWebSecurity从你的班级里删除吗?只需让@Configuration注释即可。其他配置可能会干扰您的课程。 -
@jccampanero 我删除了
@EnableWebSecurity,但我仍然得到同样的错误。我已经更新了问题并将Handler.java和RedisSessionConfig.java类。你能也检查一下吗?它还说没有找到FindByIndexNameSessionRepository类型的bean。 -
非常感谢您更新问题。我发布了一个可能的解决方案的答案。请问,你可以试试吗?
标签: java spring-boot redis spring-data-redis spring-session