У меня одни и те же таблицы БД на разных этапах (серверы БД), и я хочу сравнить содержимое этих этапов. Поэтому я хочу программно изменить источник данных во время выполнения в проекте начальной загрузки.
Я прочитал разные источники и попробовал много способов реализовать это, но до сих пор это работает только в приложении, но не в контроллере , Это означает, что когда я вызываю 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>