findbyindexnamesessionrepository在spring boot中不能为null

m0rkklqb  于 2021-06-09  发布在  Redis
关注(0)|答案(1)|浏览(947)

我正在尝试为我的spring安全应用程序实现remember函数。我也用了redis。我配置了, SpringSessionBackedSessionRegistry 豆。但当我试着
@Autowired FindByIndexNameSessionRepository 我犯了以下错误,
原因:java.lang.illegalargumentexception:sessionrepository不能为null
代码如下:,

@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时出错,该bean在类路径资源[securityconfig.class]中定义:通过工厂方法示例化bean失败;嵌套异常为org.springframework.beans.beaninstantiationexception:未能示例化[org.springframework.session.security.springsessionbackedsessionregistry]:涉及包含bean“securityconfig”的循环引用-考虑将工厂方法声明为静态,以独立于其包含示例。工厂方法“sessionregistry”引发异常;嵌套异常为java.lang.illegalargumentexception:sessionrepository不能为null
它还说,
没有'findbyindexnamesessionrepository<的bean?找到扩展会话>'类型。
我做错什么了?我怎样才能解决这个问题?有人能帮我吗?提前谢谢。

thigvfpy

thigvfpy1#

也许,我不确定,因为这个循环依赖错误。。。
在任何情况下,问题的发生可能是因为你实际上没有 FindByIndexNameSessionRepository 注入到您的spring上下文中,至少不是您试图配置的,而是一个 SessionRepository ,因为您正在定义类型为的bean RedisSessionRepository 这个接口实现 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);
    }
}

相关问题