Конфигурация Spring из yaml - объединение @ConfigurationEnabled загрузки для параметризованного имени файла

63
6

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

Когда я их запускаю, я вручную загружаю контекст

context = new ClassPathXmlApplicationContext("hal.context.xml");
context.registerShutdownHook();

и я укажу требуемый файл контекстного весны в каждом из них.

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

Моим лучшим решением было бы использовать средство Spring Boot для загрузки конфигурации (они имеют одинаковую структуру) в POJO, используя

@org.springframework.context.annotation.Configuration("configuration")
@ConfigurationProperties
@EnableConfigurationProperties

а также

@Bean
public static PropertySourcesPlaceholderConfigurer properties() {
PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer = new PropertySourcesPlaceholderConfigurer();
YamlPropertiesFactoryBean yaml = new YamlPropertiesFactoryBean();
yaml.setResources(new ClassPathResource("filename"));
propertySourcesPlaceholderConfigurer.setProperties(yaml.getObject());

return propertySourcesPlaceholderConfigurer;
}

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

<bean id="yamlProperties" class="org.springframework.beans.factory.config.YamlPropertiesFactoryBean">
<property name="resources" value="classpath:hal.config.yml"/>
</bean>

но вместо использования в качестве свойства placeholder <context:property-placeholder properties-ref="yamlProperties"/> чтобы найти способ автоматического создания POJO с конфигурацией.

заранее спасибо

Лука

спросил(а) 2021-01-25T16:59:14+03:00 4 месяца, 4 недели назад
1
Решение
77

Вы можете разделить значения конфигурации с помощью двух разных префиксов (по одному для каждого файла конфигурации):

@Bean
public static PropertySourcesPlaceholderConfigurer properties() {
PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer = new PropertySourcesPlaceholderConfigurer();
propertySourcesPlaceholderConfigurer.setPlaceholderPrefix("${app1:");
propertySourcesPlaceholderConfigurer.setPlaceholderSuffix("}");

YamlPropertiesFactoryBean yaml = new YamlPropertiesFactoryBean();
yaml.setResources(new ClassPathResource("app1_config_filename"));
propertySourcesPlaceholderConfigurer.setProperties(yaml.getObject());

return propertySourcesPlaceholderConfigurer;
}

@Bean
public static PropertySourcesPlaceholderConfigurer properties() {
PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer = new PropertySourcesPlaceholderConfigurer();
propertySourcesPlaceholderConfigurer.setPlaceholderPrefix("${app2:");
propertySourcesPlaceholderConfigurer.setPlaceholderSuffix("}");

YamlPropertiesFactoryBean yaml = new YamlPropertiesFactoryBean();
yaml.setResources(new ClassPathResource("app2_config_filename"));
propertySourcesPlaceholderConfigurer.setProperties(yaml.getObject());

return propertySourcesPlaceholderConfigurer;
}

Затем, когда вы вводите значения конфигурации в свои компоненты, вы можете:

@Value("{$app1:myVal}")
String myVal;

а также

@Value("{$app2:myVal}")
String myVal;

В bean-компоненты из app1 и app2

Надеюсь это поможет

ответил(а) 2021-01-25T16:59:14+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема