[SPRING] YamlPropertiesFactoryBean을 사용하여 Spring Framework 4.1을 사용하여 YAML 파일을로드하는 방법?
SPRINGYamlPropertiesFactoryBean을 사용하여 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.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.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.`
`
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 파일을로드하고 값을 주입 할 수 있습니다.
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
'SPRING' 카테고리의 다른 글
[SPRING] 오류 : java.lang.NoSuchMethodError : org.objectweb.asm.ClassWriter. <init> (I) V (0) | 2018.12.07 |
---|---|
[SPRING] 세터 DI 대. DI 빌더는 봄? (0) | 2018.12.07 |
[SPRING] 스프링 4 - 정적 리소스를 해결하지 않는 addResourceHandlers (0) | 2018.12.07 |
[SPRING] 자바 설정으로 Spring에서 404 에러 리디렉션 (0) | 2018.12.07 |
[SPRING] 스프링 MVC 컨트롤러의 JSON 매개 변수 (0) | 2018.12.07 |