Вы не можете переключать профили во время выполнения.Ваши варианты ограничены либо созданием нового 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
, ... из пути к классам.Вы поняли.