Пользовательский репозиторий весенней сессии Redis с Dynomite - PullRequest
0 голосов
/ 23 апреля 2019

В нашей инфраструктуре мы используем 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 компонента не имеют одинаковый тип.Именно это я и собираюсь делать, потому что мне не нужны сообщения в моем репо.

1 Ответ

0 голосов
/ 29 апреля 2019

Я открыл вопрос о репозитории github Spring-sesssion (https://github.com/spring-projects/spring-session/issues/1406).

У меня был ответ. На самом деле я сделал это неправильно. Как указано в документацииЯ должен использовать аннотацию @EnableSpringHttpSession для регистрации моего пользовательского компонента вместо @EnableRedisHttpSession.

И это работает, у меня нет проблем во время инициализации приложения.

...