Spring boot Мультимодульный проект с несколькими источниками данных - PullRequest
0 голосов
/ 27 сентября 2018

Я пытаюсь разработать многомодульный проект с весенней загрузкой с подключением к нескольким источникам данных.Я разделил этот проект на 5 модулей: -springboot-множественные-maven-модули: 1. домен -> модель базы данных 2. 2. домен2 -> модель базы данных 2. 3. постоянство -> постоянство базы данных1 4. постоянство2 -> постоянство базы данных2 5. сеть -> Доступ к базе данных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);
    }
}
  • 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 WARN 15272 --- [main] ConfigServletWebServerApplicationContext: Exceptionвстретился во время инициализации контекста - отмена попытки обновления: org.springframework.beans.factory.UnsatisfiedDependencyException: Ошибка создания бина с именем 'cocheController', определенного в файле [C: \ springboot-multiple-maven-modules \ web \ target \ classes \ rc \ web \ CocheController.class]: неудовлетворенная зависимость выражается через параметр конструктора 0;Вложенное исключение - org.springframework.beans.factory.NoSuchBeanDefinitionException: нет доступного квалифицирующего компонента типа 'rc.persistence2.CocheRepository': ожидается как минимум 1 компонент, который считается кандидатом на автоматическое подключение.Аннотации зависимостей: {} 2018-09-27 17: 08: 58.399 INFO 15272 --- [
main] j.LocalContainerEntityManagerFactoryBean: Закрытие JPA EntityManagerFactory для единицы сохраняемости 'coche' 2018-09-27 17: 08: 58.400 INFO15272 --- [main] j.LocalContainerEntityManagerFactoryBean: Закрытие JPA EntityManagerFactory для единицы сохраняемости 'hotel' 2018-09-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 требуется компонент типа 'rc.persistence2.CocheRepository', который не может бытьнайдено.

Действие:

Подумайте об определении bean-компонента типа 'rc.persistence2.CocheRepository' в вашей конфигурации.

Пожалуйста, помогите !!

Заранее спасибо!

1 Ответ

0 голосов
/ 28 сентября 2018

Вы получили ошибку в конфигурации источника данных.Ваш источник данных CocheDbConfig сканирует в базовых пакетах "rc.repository2", чтобы найти класс Repository, поэтому он не может найти bean-компонент "rc.persistence2.CocheRepository" в вашем контроллере.

Вы должны изменить основанные пакетыв вашем источнике данных database2 вот так

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