Необходимо добавить источник данных в целевой источник данных MultitenantDataSource при попадании контроллера - PullRequest
0 голосов
/ 26 апреля 2019

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