【发布时间】:2015-04-21 00:46:48
【问题描述】:
对于 Web 应用程序来说应该是一个非常常见的用例,我一直在努力解决问题。我有一个使用 REST 存储库、JPA 等的 Spring-Boot 应用程序。问题是我有两个数据源:
- 包含用户身份验证信息的嵌入式 H2 数据源
- 特定于经过身份验证的用户的实际数据的 MySQL 数据源
由于第二个数据源特定于经过身份验证的用户,因此我正在尝试使用 AbstractRoutingDataSource 在身份验证后根据 Principal 用户路由到正确的数据源。
让我抓狂的是,Spring-Boot 在启动时与我作斗争,以实例化这个数据源。我已经尝试了所有我能想到的方法,包括 Lazy 和 Scope 注释。如果我使用 Session 范围,应用程序会在启动时抛出关于没有会话存在的错误。 @Lazy 似乎根本没有帮助。无论我使用什么注释,Spring Boot 在启动时都会对数据库进行实例化,并且找不到任何实质上导致整个应用程序崩溃的查找键。
另一个问题是 Rest Repository API 让 IMO 有一种糟糕的方式来指定要使用的实际数据源。如果您有多个使用 Spring Boot 的数据源,则必须处理 Qualifier 注解,这是运行时调试的噩梦。
非常感谢任何建议。
【问题讨论】:
-
这里似乎发生的是,第二个 Spring-Boot 初始化嵌入式数据源(不是惰性的),它扫描并找到另一个数据源。 EntityManager 会感到困惑,因为在扫描期间发现了多个数据源,即使它们具有不同的限定符,它也不知道这一点,并引发有关多个可用源的错误。但是,如果我使用 Primary 注释来指定,那也会覆盖任何 @Lazy init 和 Spring-Boot 尝试立即初始化 Primary。
-
我不认为
@Primary和@Lazy不兼容或任何东西。但是我也不确定您要做什么。也许如果您使用 2DataSources和 JPA 创建一个小项目,并在此处粘贴链接,那么有人可以尝试了解您的需求。 -
我将制定一个项目。但是,我需要的是一个带有两个数据库的 Spring-Boot 项目。一个连接立即可用。其他“路由”数据源仅应在用户经过身份验证后实例化并与会话范围一起使用。我应该注意到,这在常规 Spring 上工作得非常好,但对 Spring-Boot 来说完全是无聊的,因为它非常倾向于自动配置一切。
-
如果它在非引导应用程序中工作,我保证它可以在引导应用程序中工作,一旦你弄清楚如何关闭默认行为。
标签: java spring spring-boot spring-data-rest