春季启动多模块项目多数据源



我正在尝试开发一个具有多数据源连接的多模块 Spring 启动项目。我将这个项目分为 5 个模块: -springboot-multiple-maven-modules: 1. 域->数据库2的模型 2. 域2->数据库2的模型 3. 持久性 ->数据库 1 的持久性 4. 持久性2 ->数据库2的持久性 5. Web> 访问数据库 1 和数据库 2

您可以在以下链接中下载代码: GitHub 项目

我以这种方式配置了这两个数据源: - 数据库1:

package rc.persistence;
import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef = "hotelEntityManagerFactory", transactionManagerRef = "hotelTransactionManager", basePackages = {
"rc.repository" }) //Mirar si se puede sustituir por rc.domain o rc.repository
public class HotelDbConfig {
@Autowired
private Environment env;
@Bean(name = "hotelDataSource")
@ConfigurationProperties(prefix = "hoteles.datasource")
public DataSource customDataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(env.getProperty("hoteles.datasource.driver-class-name"));
dataSource.setUrl(env.getProperty("hoteles.datasource.url"));
dataSource.setUsername(env.getProperty("hoteles.datasource.username"));
dataSource.setPassword(env.getProperty("hoteles.datasource.password"));
return dataSource;
}
@Bean(name = "hotelEntityManagerFactory")
public LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder builder,
@Qualifier("hotelDataSource") DataSource dataSource) {
return builder.dataSource(dataSource).packages("rc.domain")
.persistenceUnit("hotel").build();
}
@Bean(name = "hotelTransactionManager")
public PlatformTransactionManager transactionManager(
@Qualifier("hotelEntityManagerFactory") EntityManagerFactory entityManagerFactory) {
return new JpaTransactionManager(entityManagerFactory);
}
}
  • 数据库 2:
package rc.persistence2;
import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.env.Environment;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef = "cocheEntityManagerFactory", transactionManagerRef = "cocheTransactionManager", basePackages = {
"rc.repository2" }) 
public class CocheDbConfig {
@Autowired
private Environment env;
@Primary
@Bean(name = "cocheDataSource")
@ConfigurationProperties(prefix = "coches.datasource")
public DataSource customDataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(env.getProperty("coches.datasource.driver-class-name"));
dataSource.setUrl(env.getProperty("coches.datasource.url"));
dataSource.setUsername(env.getProperty("coches.datasource.username"));
dataSource.setPassword(env.getProperty("coches.datasource.password"));
return dataSource;
}
@Primary
@Bean(name = "cocheEntityManagerFactory")
public LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder builder,
@Qualifier("cocheDataSource") DataSource dataSource) {
return builder.dataSource(dataSource).packages("rc.domain2")
.persistenceUnit("coche").build();
}
@Primary
@Bean(name = "cocheTransactionManager")
public PlatformTransactionManager transactionManager(
@Qualifier("cocheEntityManagerFactory") EntityManagerFactory entityManagerFactory) {
return new JpaTransactionManager(entityManagerFactory);
}
}

但是当我尝试使用来自 Web 模块的存储库时:

package rc.web;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import rc.domain2.Coche;
import rc.persistence2.CocheRepository;
@RestController
public class CocheController {
@Autowired
private CocheRepository cocheRepository;
public CocheController(CocheRepository cocheRepository) {
this.cocheRepository = cocheRepository;
}
@GetMapping(value = "/coches")
public List<Coche> getCoches() {
List<Coche> hotels = this.cocheRepository.findAll();
return hotels;
}
}

它向我显示以下错误:

我尝试了不同的可能性,但总是相同的结果:

2018-09-27 17:08:58.399 警告 15272 --- [主要] ConfigServletWebServerApplicationContext : 遇到异常 在上下文初始化期间 - 取消刷新尝试: org.springframework.beans.factory.UnsatisfiedDependencyException: 创建文件中定义了名称为"cocheController"的 Bean 时出错 [C:\springboot-multiple-maven-modules\web\target\classes\rc\web\CocheController.class]: 通过构造函数参数 0 表示的未满足依赖关系; 嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException: No 提供类型为"rc.persistence2.CocheRepository"的合格 bean: 预计至少有 1 个 Bean 符合自动连线候选条件。 依赖注释: {} 2018-09-27 17:08:58.399 信息 15272 --- [
主要] j.LocalContainerEntityManagerFactoryBean : 关闭 JPA 实体管理器持久性单元"coche"工厂 2018-09-27 17:08:58.400 信息 15272 --- [主要] j.LocalContainerEntityManagerFactoryBean : 关闭 JPA 实体管理器持久性单元"酒店"工厂 2018-09-27 17:08:58.403 信息 15272 --- [ 主要] o.apache.catalina.core.StandardService : 停止服务 [Tomcat] 2018-09-27 17:08:58.421 信息 15272 --- [主要] 条件评估报告日志记录侦听器 :

启动应用程序上下文时出错。显示条件报告 在启用"调试"的情况下重新运行应用程序。2018-09-27 17:08:58.670 错误 15272 --- [ 主要] o.s.b.d.LoggingFailureAnalysisReporter :

******


描述:

rc.web.CocheController 中构造函数的参数 0 需要一个 bean 找不到类型"rc.persistence2.CocheRepository"。

行动:

考虑在 您的配置。

请帮忙!!

提前感谢!

数据源配置中出现错误。您的CocheDbConfig数据源正在扫描基于的包"rc.repository2"以查找存储库类,因此它无法在控制器中找到bean "rc.persistence2.CocheRepository"。

您应该像这样更改 database2 数据源中的基础包

@EnableJpaRepositories(entityManagerFactoryRef = "cocheEntityManagerFactory", transactionManagerRef = "cocheTransactionManager", basePackages = {
"rc.persistence2" })

最新更新