Динамическое переключение между файлами свойств на основе параметра заголовка запроса в приложении весенней загрузки - PullRequest
4 голосов
/ 28 сентября 2019

Я разрабатываю мультитенантное приложение REST для весенней загрузки.Я могу динамически переключаться между различными источниками данных на основе значения заголовка в каждом запросе.Но моя проблема в файле application.properties.Разные клиенты имеют разные значения для одних и тех же свойств в своих файлах свойств.

Как можно разделить файлы свойств для каждого клиента, а также динамически определить, какие файлы свойств использовать, основываясь на значении в заголовке запроса

Ответы [ 2 ]

0 голосов
/ 30 сентября 2019

Вы не можете переключать профили во время выполнения.Ваши варианты ограничены либо созданием нового ApplicationContext, который имеет свои недостатки, либо вы можете загрузить файлы свойств арендатора при запуске и реализовать специфичный для арендатора метод getProperty, который вызывается при необходимости.

Этоследует обработать последний случай:

@Component
public class TenantProperties {

  private Map<String, ConfigurableEnvironment> customEnvs;

  @Inject
  public TenantProperties(@Autowired ConfigurableEnvironment defaultEnv,
      @Value("${my.tenant.names}") List<String> tenantNames) {

    this.customEnvs = tenantNames
        .stream()
        .collect(Collectors.toMap(
            Function.identity(),
            tenantId -> {
              ConfigurableEnvironment customEnv = new StandardEnvironment();
              customEnv.merge(defaultEnv);
              Resource resource = new ClassPathResource(tenantId + ".properties");

              try {
                Properties props = PropertiesLoaderUtils.loadProperties(resource);
                customEnv.getPropertySources()
                    .addLast(new PropertiesPropertySource(tenantId, props));
                return customEnv;
              } catch (IOException ex) {
                throw new RuntimeException(ex);
              }
            }));
  }

  public String getProperty(String tenantId, String propertyName) {

    ConfigurableEnvironment ce = this.customEnvs.get(tenantId);
    if (ce == null) {
      throw new IllegalArgumentException("Invalid tenant");
    }

    return ce.getProperty(propertyName);
  }
}

Вам необходимо добавить свойство my.tenant.names в основные свойства приложения, которое содержит разделенный запятыми список имен арендаторов (name1, name2 и т. д.).специфичные для клиента свойства загружаются из name1.properties, ... из пути к классам.Вы поняли.

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

Профили Spring будут работать в вашем случае.

Если арендаторы статичны в смысле прогнозирующих арендаторов и его свойств только перед запуском службы, то я бы предложил tovgo для файлов, специфичных для статического профиля.

Если некоторые свойства могут быть изменены, пока служба обслуживает других арендаторов, то было бы хорошо перейти на сервер конфигурации, чтобы без перезапуска вы могли изменить их.

Если арендаторы являются динамическими, вы можете перейти кдБ на основе ваших данных, если количество арендаторов может существенно возрасти.

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