【问题标题】:FindByIndexNameSessionRepository cannot be null in Spring Boot在 Spring Boot 中 FindByIndexNameSessionRepository 不能为空
【发布时间】: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 和Redis SessionConfig.java 类。你能也检查一下吗?它还说没有找到FindByIndexNameSessionRepository类型的bean。
  • 非常感谢您更新问题。我发布了一个可能的解决方案的答案。请问,你可以试试吗?

标签: java spring-boot redis spring-data-redis spring-session


【解决方案1】:

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

无论如何,问题可能正在发生,因为您实际上并没有在 Spring 上下文中注入 FindByIndexNameSessionRepository,至少不是您要配置的那个,而是 SessionRepository,因为您正在定义一个RedisSessionRepository 类型的 bean,此接口实现 SessionRepository,而不是 FindByIndexNameSessionRepository。请尝试使用RedisIndexedSessionRepository,例如:

@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);
    }
}

【讨论】:

  • 非常感谢您花时间和精力来解决这个问题,先生。我真的很感激。我这样做了,但现在我收到一个错误,说是两个 bean redisSessionRepository 和 sessionRepository。我什至评论了 redisSessionRepository 但没有成功?先生,还有其他方法可以为FindByIndexNameSessionRepository 创建 bean 吗?
  • 请看我更新的答案。您只需要定义一个 bean,而不是两个。你能试试吗?你遇到了什么错误?
  • 我现在要离开了,但是请发表您认为合适的任何评论,我会尽快审核
  • @HAthukorala 您在解决问题方面取得了进展吗?
  • 不客气@HAthukorala,谢谢。我很高兴听到您终于能够解决您的问题。
猜你喜欢
  • 2017-11-29
  • 1970-01-01
  • 1970-01-01
  • 2018-08-25
  • 2017-06-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-01
  • 1970-01-01
相关资源
最近更新 更多