У меня есть многопользовательская структура базы данных моей базы данных, которая содержит основную базу данных, которая содержит другие сведения о базе данных, и я сделал основную базу данных своим источником данных по умолчанию, из основной базы данных мне нужно получить список других баз данных и поместить его в bean-компонент источника данных менеджера сущностей фабрика, и если я делаю это как статический набор источников данных с помощью аннотации @configure, то это работает нормально, если я делаю это динамически, удаляя аннотацию конфигурации, я не могу получить доступ к базе данных, приведенной ниже, это мой код для каждого класса, где я реализую мультитенантность.
/*if i put @configuration it works fine*/
public class MultitenantConfiguration {
@Bean
@ConfigurationProperties(
prefix = "spring.datasource")
public DataSource dataSource(ArrayList<String> names) {
Map<Object,Object> resolvedDataSources = new HashMap<>();
for(String dbName: names) {
DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create(this.getClass().getClassLoader());
dataSourceBuilder.driverClassName("com.microsoft.sqlserver.jdbc.SQLServerDriver")
.url("jdbc:sqlserver://abc.server;databaseName="+dbName+"")
.username("userName")
.password("Password");
resolvedDataSources.put(dbName, dataSourceBuilder.build());
}
MultitenantDataSource dataSource = new MultitenantDataSource();
dataSource.setDefaultTargetDataSource(defaultDataSource());
dataSource.setTargetDataSources(resolvedDataSources);
dataSource.afterPropertiesSet();
return dataSource;
}
/**
* Creates the default data source for the application
* @return
*/
private DataSource defaultDataSource() {
DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create(this.getClass().getClassLoader())
.driverClassName("com.microsoft.sqlserver.jdbc.SQLServerDriver")
.url("jdbc:abc.server;databaseName=test")
.username("UserName")
.password("Password");
return dataSourceBuilder.build();
}}
/* Controller Class */
@RestController
public class TestController {
@Autowired
private ClientService clientService;
@RequestMapping("/home")
public String home(HttpServletRequest request,HttpServletResponse response) {
MultitenantConfiguration mt= new MultitenantConfiguration();
ArrayList<String> clients=clientService.getAllClients();
mt.dataSource(clients);
return "home value";
}
/*Tenant Context*/
public class TenantContext {
private static ThreadLocal<Object> currentTenant = new ThreadLocal<>();
public static void setCurrentTenant(Object tenant) {
currentTenant.set(tenant);
}
public static Object getCurrentTenant() {
return currentTenant.get();
}
}
/*MultitenantDataSource class*/
public class MultitenantDataSource extends AbstractRoutingDataSource{
@Override
protected Object determineCurrentLookupKey() {
return TenantContext.getCurrentTenant();
}
}