YamlPropertiesFactoryBean을 사용하여 Spring Framework 4.1을 사용하여 YAML 파일을 로드하는 방법은 무엇입니까?
현재 *.properties 파일을 사용하고 있는 스프링 어플리케이션이 있는데 대신 YAML 파일을 사용하고 싶습니다.
저는 Yaml Properties Factory Bean 클래스가 제가 필요한 일을 할 수 있을 것 같은 것을 찾았습니다.
문제는 주석 기반 구성을 사용하는 Spring 응용 프로그램에서 이 클래스를 어떻게 사용해야 할지 모르겠다는 것입니다.set BeanFactory 메서드로 PropertySources Placeholder Configurer에서 구성해야 할 것 같습니다.
이전에 저는 @PropertySource를 사용하여 다음과 같이 속성 파일을 로드하고 있었습니다.
@Configuration
@PropertySource("classpath:/default.properties")
public class PropertiesConfig {
@Bean
public static PropertySourcesPlaceholderConfigurer placeholderConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}
}
PropertySourcesPlaceholderConfigurer에서 YamlPropertiesFactoryBean을 활성화하여 YAML 파일을 직접 로드할 수 있도록 하려면 어떻게 해야 합니까?아니면 다른 방법이 있을까요?
감사해요.
제 애플리케이션은 주석 기반 구성을 사용하고 있고 스프링 프레임워크 4.1.4를 사용하고 있습니다.몇 가지 정보를 찾았는데 항상 Spring Boot을 가리켰어요, 이런 식으로.
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"/>
물론 런타임 클래스 경로에 대한 의존성이 있어야 합니다.
java config보다는 XML config를 선호하지만, 변환하는 것은 어렵지 않을 것 같습니다.
편집:
완전성을 위해 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;
}
봄에 .yml 파일을 읽으려면 다음 접근 방법을 사용할 수 있습니다.
예를 들어 다음과 같은 .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.
}
이제 이러한 콩을 구성 요소에 자동으로 연결할 수 있습니다.예를 들어,
@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 {
....
}
`
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);
}
}
My-Yaml-Example-File.yml
person:
firstName: Mahmoud
middleName:Ahmed
github spring-boot-yaml-sample 예 참조 @Value()를 사용하여 yaml 파일을 로드하고 값을 주입할 수 있습니다.
저는 yml/yaml 파일(application.yml이 아닌)의 외부 구성이 왜 이렇게 다른지 이해하는데 5~6시간을 소비합니다.다양한 기사를 읽고 오버플로우 질문을 쌓았지만 정답을 맞히지 못했습니다.
YamlPropertySourceLoader를 사용하여 사용자 지정 yml 파일 값을 사용할 수 있는 것처럼 중간에 끼어 있었지만 @Value를 사용할 수 없었습니다. 자동 배선 종속성 인젝션 실패와 같은 오류가 발생하고 있고, 중첩 예외는 java.lang입니다.불법 논변예외: 자리 표시자의 전체 이름을 확인할 수 없습니다.firstname' 값이 "${fullname"입니다.firstname}"
fullname은 yml의 속성입니다.
그런 다음 위의 솔루션에 주어진 "터틀즈 다운"을 사용했고, 마침내 yaml 파일에 문제없이 @Value를 사용할 수 있게 되었고 YamlPropertySourceLoader를 제거했습니다.
YamlPropertySourceLoader와 PropertySources PlaceholderConfigurer의 차이점을 이해했습니다. 큰 감사를 드립니다. 하지만 이러한 변경 사항을 깃레포에 추가했습니다.
Git Repo: https://github.com/Atishay007/spring-boot-with-restful-web-services
클래스 이름: Spring Microservices Application.java
봄에 yaml 파일을 Properties에 로드하는 방법을 찾는다면 다음과 같은 해결책이 있습니다.
public Properties loadYaml(String fileName){
// fileName for eg is "my-settings.yaml"
YamlPropertySourceLoader ypsl = new YamlPropertySourceLoader();
PropertySource ps = ypsl.load(fileName, new ClassPathResource(fileName)).get(0);
Properties props = new Properties();
props.putAll((Map)ps.getSource());
return props;
}
언급URL : https://stackoverflow.com/questions/28303758/how-to-use-yamlpropertiesfactorybean-to-load-yaml-files-using-spring-framework-4
'programing' 카테고리의 다른 글
목표 C에서 'int' 배열의 길이 (0) | 2023.09.08 |
---|---|
Spring Data에서 동일한 QueryDSL 경로에 대해 여러 개 (0) | 2023.09.08 |
경고: CSRF 토큰 인증 레일을 확인할 수 없습니다. (0) | 2023.09.08 |
부트스트랩은 나비 막대 항목을 오른쪽으로 정렬합니다. (0) | 2023.09.08 |
Last not empty cell (column) in the given row; Excel VBA (0) | 2023.09.08 |