Подтвердить что ты не робот

Как использовать 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, например этот.

4b9b3361

Ответ 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 {
    ....
}