Spring Boot: изменение источника данных во время выполнения - PullRequest
1 голос
/ 21 апреля 2020

У меня одни и те же таблицы БД на разных этапах (серверы БД), и я хочу сравнить содержимое этих этапов. Поэтому я хочу программно изменить источник данных во время выполнения в проекте начальной загрузки.

Я прочитал разные источники и попробовал много способов реализовать это, но до сих пор это работает только в приложении, но не в контроллере , Это означает, что когда я вызываю URL, мне нужно выбрать источник данных раньше, и я могу получить доступ только к этому одному источнику данных в контроллере.

Как я могу инициировать изменение в Сервисе или Репозитории?

@Configuration
@ConfigurationProperties(prefix = "db")
@PropertySource("classpath:application.yml")
public class DatabaseConfigurations {
private Map<String, DatabaseConfiguration> configurations = new HashMap<>();

    public Map<String, DatabaseConfiguration> getConfigurations() {
        return configurations;
    }

    public void setConfigurations(Map<String, DatabaseConfiguration> configurations) {
        this.configurations = configurations;
    }

    public Map<Object, Object> createTargetDataSources() {
        Map<Object, Object> result = new HashMap<>();
        configurations.forEach((key, value) -> result.put(key, value.createDataSource()));
        return result;
    }  
}

public class CustomRoutingDataSource extends AbstractRoutingDataSource {
@Override
public Object determineCurrentLookupKey() {
    String value = System.getProperty("spring.datasource.name");
    if (Environment.PROD_TEST.isValid(value)) {
        return value;
    } else {
        return "prodTest";
    }
}
}

@SpringBootApplication
@EnableConfigurationProperties(DatabaseConfigurations.class)
public class DatabaseApplication {

@Autowired
DatabaseConfigurations databaseConfigurations;

@Bean
public DataSource dataSource() {
    CustomRoutingDataSource dataSource = new CustomRoutingDataSource();
    dataSource.setTargetDataSources(databaseConfigurations.createTargetDataSources());
    return dataSource;
}

public static void main(String[] args) {
    SpringApplication.run(DatabaseApplication.class, args);
}

@Bean
public CommandLineRunner run(RService rService) throws Exception {
    return (String[] args) -> {

        // working
        R left = rService.readR(Environment.PROD_TEST);
        R right = rService.readR(Environment.PROD_ENTW);
    };
}

@Controller
public class CompareController {
private final RService rService;

public CompareController(RService rService) {
    this.rService = rService;
}

@PostMapping("/compare")
public String showComparePost(@ModelAttribute("formObject") CompareFormObject formObject, Model 
model) {
    if (formObject != null) {

        // not working!
        R left = rService.readR(Environment.PROD_ENTW);
        R right = rService.readR(Environment.PROD_TEST);
    }

    model.addAttribute("left", left);
    model.addAttribute("right", right);
    return "compare";
}

public class RService {
    public R readR(Environment environment) {
    System.setProperty("spring.datasource.name", environment.getDisplayName());
    return readR();
    }
}

пом. xml

<modelVersion>4.0.0</modelVersion>

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.6.RELEASE</version>
    <relativePath/> 
</parent>

<groupId>com....</groupId>
<artifactId>Comparator</artifactId>
<version>1.0.0-SNAPSHOT</version>
<name>Comparator</name>

<properties>
    <java.version>1.8</java.version>
    <oracle.version>12.1.0.2.0</oracle.version>
    <project.build.sourceEncoding>ISO-8859-1</project.build.sourceEncoding>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-validator</artifactId>
        <version>5.1.3.Final</version>
    </dependency>
    <dependency>
        <groupId>com.oracle</groupId>
        <artifactId>ojdbc</artifactId>
        <version>${oracle.version}</version>
    </dependency>
    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.mockito</groupId>
        <artifactId>mockito-core</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.12</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...