В нашей инфраструктуре мы используем Redis с Dynomite для репликации через центр обработки данных и высокую доступность.Одно из наших приложений на Java, и мы в основном используем весеннюю экосистему.
В этом приложении мы управляем сессией, используя spring-session, и используем кластер Redis для хранения сессий.
SpringСессия использует команды pub / sub, которые не разрешены в контексте Dynomite, поэтому нам нужно перейти в пользовательский репозиторий.
Я пытался это сделать, но у меня проблема с классом весенней загрузки и автоконфигурации.
пожалуйста, найдите ниже некоторую часть нашего кода.
зависимости в build.gradle
val springBootVersion = "2.1.4.RELEASE"
val springSessionDataRedisVersion = "2.1.5.RELEASE"
implementation("org.springframework.boot:spring-boot-starter-security:$springBootVersion")
implementation("org.springframework.boot:spring-boot-starter-thymeleaf:$springBootVersion")
implementation("org.springframework.boot:spring-boot-starter-web:$springBootVersion")
implementation("org.springframework.boot:spring-boot-starter-data-redis:$springBootVersion")
implementation("org.springframework.session:spring-session-data-redis:$springSessionDataRedisVersion")
Наш класс конфигурации для переопределения sessionRepository с нашим пользовательским
@Configuration
@EnableRedisHttpSession
public class SessionConfig extends AbstractHttpSessionApplicationInitializer {
@Bean
public SessionRepository sessionRepository() {
return new RedisDynoSessionRepository();
}
}
Пользовательский класс sessionRepository
public class RedisDynoSessionRepository implements SessionRepository {
...
}
Когда мы запускаем наше приложение, мы сталкиваемся с бином, потому что приложение обнаруживает, что репозиторий сессий бина уже известен.
org.springframework.beans.factory.support.BeanDefinitionOverrideException: Invalid bean definition with name 'sessionRepository' defined in class path resource [com/orange/ccmd/spring/redis/SessionConfig.class]: Cannot register bean definition [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=sessionConfig; factoryMethodName=sessionRepository; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [com/orange/ccmd/spring/redis/SessionConfig.class]] for bean 'sessionRepository': There is already [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration; factoryMethodName=sessionRepository; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfiguration.class]] bound.
Я ищу способ обойти эту проблему, может быть с незарегистрированной бин?
Спасибо за вашу помощь.
[EDIT]
Я попробовал @Pримари на бобе, и это не работает.Если я назвал свой компонент по-другому, Spring использует стандартный компонент, а не мой новый.Если я назвал его так же, у меня возникла ошибка конфликта.Если я добавлю конфигурацию переопределенного компонента (spring.main.allow-bean-definition-overriding=true
), у меня будет ошибка, потому что 2 компонента не имеют одинаковый тип.Именно это я и собираюсь делать, потому что мне не нужны сообщения в моем репо.