복붙노트

[SPRING] YamlPropertiesFactoryBean을 사용하여 Spring Framework 4.1을 사용하여 YAML 파일을로드하는 방법?

SPRING

YamlPropertiesFactoryBean을 사용하여 Spring Framework 4.1을 사용하여 YAML 파일을로드하는 방법?

나는 현재 * .properties 파일을 사용하고있는 Spring 애플리케이션을 가지고 있으며 대신 YAML 파일을 사용하고 싶다.

내가 원하는 것을 할 수있는 것처럼 보이는 YamlPropertiesFactoryBean 클래스를 찾았습니다.

내 문제는 (주석 기반 구성을 사용하는) 내 Spring 애플리케이션에서이 클래스를 사용하는 방법을 모르겠다는 것이다. 그것은 setBeanFactory 메서드를 사용하여 PropertySourcesPlaceholderConfigurer에서 구성해야합니다.

이전에 다음과 같이 @PropertySource를 사용하여 속성 파일을로드했습니다.

@Configuration
@PropertySource("classpath:/default.properties")
public class PropertiesConfig {

    @Bean
    public static PropertySourcesPlaceholderConfigurer placeholderConfigurer() {
        return new PropertySourcesPlaceholderConfigurer();
    }
}

YAML 파일을 직접로드 할 수 있도록 PropertySourcesPlaceholderConfigurer에서 YamlPropertiesFactoryBean을 활성화하려면 어떻게해야합니까? 아니면 다른 방법이 있습니까?

감사.

내 응용 프로그램은 주석 기반 구성을 사용하고 있으며 Spring Framework 4.1.4를 사용하고 있습니다. 몇 가지 정보를 찾았지만, 항상 스프링 부트로 지적했습니다.

해결법

  1. ==============================

    1.XML 구성을 사용하여이 구조를 사용했습니다.

    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 종속성을 가져야합니다.

    Java 구성보다 XML 구성을 선호하지만 변환하지 않아야합니다.

    편집하다: 완전성을위한 자바 설정

    @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. ==============================

    2.Spring에서 .yaml 파일을 읽으려면 다음 접근법을 사용할 수 있습니다.

    Spring에서 .yaml 파일을 읽으려면 다음 접근법을 사용할 수 있습니다.

    예를 들어 다음과 같은 .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.
    }
    

    이제 당신은 당신의 구성 요소에서 이러한 bean을 autowire 할 수 있습니다. 예 :

    @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 {
        ....
    }
    
  3. ==============================

    3.`

    `

    package com.yaml.yamlsample;
    
    import com.yaml.yamlsample.config.factory.YamlPropertySourceFactory;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.boot.CommandLineRunner;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.context.annotation.PropertySource;
    
    @SpringBootApplication
    @PropertySource(value = "classpath:My-Yaml-Example-File.yml", factory = YamlPropertySourceFactory.class)
    public class YamlSampleApplication implements CommandLineRunner {
    
        public static void main(String[] args) {
            SpringApplication.run(YamlSampleApplication.class, args);
        }
    
        @Value("${person.firstName}")
        private String firstName;
        @Override
        public void run(String... args) throws Exception {
            System.out.println("first Name              :" + firstName);
        }
    }
    
    
    package com.yaml.yamlsample.config.factory;
    import org.springframework.boot.env.YamlPropertySourceLoader;
    import org.springframework.core.env.PropertySource;
    import org.springframework.core.io.support.DefaultPropertySourceFactory;
    import org.springframework.core.io.support.EncodedResource;
    import java.io.IOException;
    import java.util.List;
    
    public class YamlPropertySourceFactory extends DefaultPropertySourceFactory {
        @Override
        public PropertySource createPropertySource(String name, EncodedResource resource) throws IOException {
             if (resource == null) {
                return super.createPropertySource(name, resource);
            }
            List<PropertySource<?>> propertySourceList = new YamlPropertySourceLoader().load(resource.getResource().getFilename(), resource.getResource());
            if (!propertySourceList.isEmpty()) {
                return propertySourceList.iterator().next();
            }
            return super.createPropertySource(name, resource);
        }
    }
    

    내 -Yaml-Example-File.yml

    person:
      firstName: Mahmoud
      middleName:Ahmed
    

    내 예제를 github spring-boot-yaml-sample에서 참조하십시오. @Value ()를 사용하여 yaml 파일을로드하고 값을 주입 할 수 있습니다.

  4. from https://stackoverflow.com/questions/28303758/how-to-use-yamlpropertiesfactorybean-to-load-yaml-files-using-spring-framework-4 by cc-by-sa and MIT license