gpt4 book ai didi

java - 在 Spring Boot 中 FindByIndexNameSessionRepository 不能为空

转载 作者:行者123 更新时间:2023-12-03 06:44:20 28 4
gpt4 key购买 nike

我正在尝试为我的 Spring Security 应用程序实现记住功能。我也使用了 Redis。我配置了,SpringSessionBackedSessionRegistry bean 。但是当我尝试 @Autowired FindByIndexNameSessionRepository我收到以下错误,

Caused by: java.lang.IllegalArgumentException: sessionRepositorycannot be 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 session 配置,
@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);
}
}
我收到错误,例如,

Caused by: java.lang.IllegalArgumentException: sessionRepositorycannot be null Caused by:org.springframework.beans.BeanInstantiationException: Failed toinstantiate[org.springframework.session.security.SpringSessionBackedSessionRegistry]:Circular reference involving containing bean 'securityConfig' -consider declaring the factory method as static for independence fromits containing instance. Factory method 'sessionRegistry' threwexception; nested exception is java.lang.IllegalArgumentException:sessionRepository cannot be null Caused by:org.springframework.beans.factory.BeanCreationException: Errorcreating bean with name 'sessionRegistry' defined in class pathresource [SecurityConfig.class]: Bean instantiation via factory methodfailed; nested exception isorg.springframework.beans.BeanInstantiationException: Failed toinstantiate[org.springframework.session.security.SpringSessionBackedSessionRegistry]:Circular reference involving containing bean 'securityConfig' -consider declaring the factory method as static for independence fromits containing instance. Factory method 'sessionRegistry' threwexception; nested exception is java.lang.IllegalArgumentException:sessionRepository cannot be null


它还说,

No beans of 'FindByIndexNameSessionRepository<? extends Session>' typefound.


那么我在这里做错了什么?

最佳答案

也许,我不确定,因为这个循环依赖错误......
无论如何,问题可能正在发生,因为您实际上没有 FindByIndexNameSessionRepository在您的 Spring 上下文中注入(inject),至少不是您要配置的那个,而是一个 SessionRepository , 因为你定义了一个 RedisSessionRepository 类型的 bean这个接口(interface)实现了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);
}
}

关于java - 在 Spring Boot 中 FindByIndexNameSessionRepository 不能为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64794763/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com