Как использовать YamlPropertiesFactoryBean для загрузки файлов YAML с помощью Spring Framework 4.1?
У меня есть приложение spring, которое в настоящее время использует файлы *.properties, и я хочу использовать его вместо файлов YAML.
Я нашел класс YamlPropertiesFactoryBean, который, похоже, способен делать то, что мне нужно.
Моя проблема в том, что я не уверен, как использовать этот класс в моем приложении spring (который использует конфигурацию на основе аннотаций).
Кажется, я должен настроить его в PropertySourcesPlaceholderConfigurer с помощью метода setBeanFactory.
Раньше я загружал файлы свойств с помощью @PropertySource следующим образом:
@Configuration
@PropertySource("classpath:/default.properties")
public class PropertiesConfig {
@Bean
public static PropertySourcesPlaceholderConfigurer placeholderConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}
}
Как я могу включить YamlPropertiesFactoryBean в PropertySourcesPlaceholderConfigurer, чтобы я мог напрямую загружать файлы YAML?
Или есть другой способ сделать это?
Спасибо.
Мое приложение использует конфигурацию на основе аннотаций, и я использую spring Framework 4.1.4.
Я нашел некоторую информацию, но всегда указывал мне на spring Boot, например этот.
Ответы
Ответ 1
С конфигурацией XML я использовал эту конструкцию:
<context:annotation-config/>
<bean id="yamlProperties" class="org.springframework.beans.factory.config.YamlPropertiesFactoryBean">
<property name="resources" value="classpath:test.yml"/>
</bean>
<context:property-placeholder properties-ref="yamlProperties"/>
Конечно, вы должны иметь зависимость от snakeyaml от вашего пути к среде выполнения.
Я предпочитаю конфигурацию XML через java-конфигурацию, но я не могу ее преобразовать.
Редактирование:
java config для полноты
@Bean
public static PropertySourcesPlaceholderConfigurer properties() {
PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer = new PropertySourcesPlaceholderConfigurer();
YamlPropertiesFactoryBean yaml = new YamlPropertiesFactoryBean();
yaml.setResources(new ClassPathResource("default.yml"));
propertySourcesPlaceholderConfigurer.setProperties(yaml.getObject());
return propertySourcesPlaceholderConfigurer;
}
Ответ 2
Чтобы прочитать .yml файл в Spring, вы можете использовать следующий подход.
Например, у вас есть этот .yml файл:
section1:
key1: "value1"
key2: "value2"
section2:
key1: "value1"
key2: "value2"
Затем определите 2 Java POJO:
@Configuration
@EnableConfigurationProperties
@ConfigurationProperties(prefix = "section1")
public class MyCustomSection1 {
private String key1;
private String key2;
// define setters and getters.
}
@Configuration
@EnableConfigurationProperties
@ConfigurationProperties(prefix = "section2")
public class MyCustomSection1 {
private String key1;
private String key2;
// define setters and getters.
}
Теперь вы можете автоповторить эти beans в своем компоненте. Например:
@Component
public class MyPropertiesAggregator {
@Autowired
private MyCustomSection1 section;
}
Если вы используете Spring Boot, все будет автоматически сканироваться и создаваться:
@SpringBootApplication
public class MainBootApplication {
public static void main(String[] args) {
new SpringApplicationBuilder()
.sources(MainBootApplication.class)
.bannerMode(OFF)
.run(args);
}
}
Если вы используете JUnit, существует базовая тестовая установка для загрузки файла YAML:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(MainBootApplication.class)
public class MyJUnitTests {
...
}
Если вы используете TestNG, есть образец тестовой конфигурации:
@SpringApplicationConfiguration(MainBootApplication.class)
public abstract class BaseITTest extends AbstractTestNGSpringContextTests {
....
}