【问题标题】:Springboot Session Cannot be created when 2 or more datasources exist存在2个或更多数据源时无法创建Spring Boot Session
【发布时间】:2020-11-11 08:21:16
【问题描述】:

OK - 问题 ==> 2 个(或更多)数据源在使用 Springboot Session 时会导致错误。

我有一个 Springboot 项目,有不同的数据源用于不同的目的。所以在上述项目中,我想让 Spring 用 Spring-Session 模块的 HttpSession 替换 HttpSession。

如果您遵循指南,会话表的创建很简单。 但是指南和 API 文档说您需要只需要一个数据源。因此,由于我有 2 个或更多,我收到以下错误:

2020-07-21 21:38:59.134 ERROR 171262 --- [  restartedMain] o.s.b.web.embedded.tomcat.TomcatStarter  : 
Error starting Tomcat context. Exception: org.springframework.beans.factory.UnsatisfiedDependencyException. 
Message: Error creating bean with name 'sessionRepositoryFilterRegistration' defined in class path resource 
[org/springframework/boot/autoconfigure/session/SessionRepositoryFilterConfiguration.class]: 
Unsatisfied dependency expressed through method 'sessionRepositoryFilterRegistration' parameter 1; 
nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with 
name 'org.springframework.session.jdbc.config.annotation.web.http.JdbcHttpSessionConfiguration': 
Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: 
No qualifying bean of type 'javax.sql.DataSource' available: 
expected single matching bean but found 2: authModelDs,secureSessionDS

所以由于它无法决定使用哪一个,所以我必须手动配置它,除了整个过程将您带到一个名为
的类 org.springframework.session.jdbc.config.annotation.web.http.JdbcHttpSessionConfiguration,在给定需要设置您自己的数据源的情况下,它实际上是不可配置的。

我看了一圈,没有办法配置会话过滤器,一旦创建它来替换那里的数据源。

所以我很困惑:如何为配置的 Spring-Session 设置正确的数据源?

任何帮助将不胜感激。

【问题讨论】:

  • 尝试将其中一个数据源标记为@Primary@Qualifier 注入的实例,以便Spring 可以在注入时解析使用哪一个。
  • 谢谢 Andrew S,我也使用了这些资源。在 Spring-Boot 中创建 Session 的工作相当深入。在某些时候,一个名为 JdbcHttpSessionConfiguration 的类会设置数据源,它会获取 [所有可用的] 数据源,即使我声明一个且只有一个作为主要数据源。因此,由于它找到 2 个或更多,它会引发错误。我的任务是告诉 JdbcHttpSessionConfiguration 加载特定的数据源。我现在很忙,我相信我很快就会找到答案。
  • 我将添加一些额外的堆栈跟踪 - org.springframework.beans.factory.NoUniqueBeanDefinitionException:没有可用的“javax.sql.DataSource”类型的合格 bean:预期的单个匹配 bean,但找到了 2: authModelDs,secureSessionDS at org.springframework.beans.factory.config.DependencyDescriptor.resolveNotUnique(DependencyDescriptor.java:220) at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1282)

标签: java spring-boot session jdbc


【解决方案1】:

啊哈!呜呜呜

您可以在创建数据源的 Bean 上放置一个注解,以指定此类 bean 是 SpringBoot 会话数据源。

注解是 - @SpringSessionDataSource

这在文档中根本不是直截了当的东西!

以下 Stack Overflow 答案的提示:

Spring Boot and Spring Session: How to control the DataSource

【讨论】:

    猜你喜欢
    • 2017-04-17
    • 2016-08-09
    • 2019-09-09
    • 2018-10-13
    • 2020-11-17
    • 1970-01-01
    • 1970-01-01
    • 2014-04-10
    • 2018-12-11
    相关资源
    最近更新 更多