Весенний загрузочный мультимодульный проект с несколькими источниками данных
Я пытаюсь разработать многомодульный проект весенней загрузки с подключением к нескольким источникам данных. Я разделил этот проект на 5 модулей: -springboot-множественные-maven-модули: 1. домен -> модель базы данных 2. 2. домен2 -> модель базы данных 2. 3. постоянство -> постоянство базы данных1 4. постоянство2 -> постоянство базы данных2 5. сеть - > Доступ к базе данных1 и базе данных2
Вы можете скачать код по следующей ссылке: GitHub Project
Я настроил оба источника данных следующим образом: - database1:
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);
}
}
- database2:
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);
}
}
Но когда я пытаюсь использовать репозитории из веб-модуля:
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 --- [ main] ConfigServletWebServerApplicationContext: Возникла исключительная ситуация во время инициализации контекста - отмена попытки обновления: org.springframework.beans.factory.UnsatisfiedDependencyException: ошибка создания бина с именем "cocheController", определенного в file [C:\springboot-множественные maven-modules\web\target\classes\rc\web\CocheController.class]: неудовлетворенная зависимость, выраженная через параметр конструктора 0; Вложенное исключение - org.springframework.beans.factory.NoSuchBeanDefinitionException: нет доступного квалифицирующего компонента типа 'rc.persistence2.CocheRepository': ожидается как минимум один компонент, который считается кандидатом на автоматическое подключение. Аннотации зависимостей: {} 2018-09-27 17: 08: 58.399 INFO 15272 --- [
main] j.LocalContainerEntityManagerFactoryBean: Закрытие JPA EntityManagerFactory для единицы сохраняемости "coche" 2018-09-27 17:08:58.400 INFO 15272 --- [ main] j.LocalContainerEntityManagerFactoryBean: Закрытие JPA EntityManagerFactory для персоны 2018 для персистентности 27 17:08:58.403 INFO 15272 --- [ main] o.apache.catalina.core.StandardService: Остановка службы [Tomcat] 2018-09-27 17:08:58.421 INFO 15272 --- [ main] ConditionEvaluationReportLoggingListener:Ошибка запуска ApplicationContext. Чтобы отобразить отчет об условиях, перезапустите приложение с включенной отладкой. 2018-09-27 17:08:58.670 ОШИБКА 15272 --- [main] osbdLoggingFailureAnalysisReporter:
*************************** Приложение не удалось запустить
Описание:
Параметр 0 конструктора в rc.web.CocheController требует bean-компонент типа 'rc.persistence2.CocheRepository', который не может быть найден.
Действие:
Попробуйте определить bean-компонент типа "rc.persistence2.CocheRepository" в вашей конфигурации.
Пожалуйста помоги!!
Заранее спасибо!
1 ответ
Вы получили ошибку в конфигурации источника данных. Ваш источник данных CocheDbConfig сканирует в основанных пакетах "rc.repository2", чтобы найти класс Repository, поэтому он не может найти bean-компонент rc.persistence2.CocheRepository в вашем контроллере.
Вы должны изменить основанные пакеты в вашем источнике данных database2, как это
@EnableJpaRepositories(entityManagerFactoryRef = "cocheEntityManagerFactory", transactionManagerRef = "cocheTransactionManager", basePackages = {
"rc.persistence2" })