복붙노트

[SPRING] Java에서 yaml로부터 맵 읽기

SPRING

Java에서 yaml로부터 맵 읽기

봄을 사용하여 자바를 통해 내 yaml을 읽는 데 문제가 있습니다. 먼저 코드를 보여 드리겠습니다.

@Component
@EnableConfigurationProperties
@ConfigurationProperties(prefix = "countries")
public class UserLimitReader {

    private HashMap<String, Integer> orders;

    private HashMap<String, Integer> requests;

    public HashMap<String, Integer> getOrders() {
        return orders;
    }

    public void setOrderRedeemableLimit(HashMap<String, Integer>         orders) 
{
        this.orders= orders;
}

public HashMap<String, Integer> getRequests() {
    return requests;
}

public void setMonthlyRedeemableLimit(HashMap<String, Integer> requests) {
    this.requests= requests;
}
}

내 yaml 파일 :

cassandra:
    hosts: localhost:9142, 127.0.0.1:9142
    keyspace: test
countries:
    orders:
      JPY: 1000
      USD: 1000
    requests:
      JPY: 100000
      USD: 100000

스프링 컨텍스트 xml은 또한 다음과 같습니다.

<bean id="yamlProperties"
    class="org.springframework.beans.factory.config.YamlPropertiesFactoryBean">
    <property name="resources">
        <value>classpath:config/application.yaml</value>
    </property>
</bean>

<context:property-placeholder
    properties-ref="yamlProperties" />

이제 내가 가지고있는 기대는 봄 테스트 응용 프로그램의 런타임 중에 (컨텍스트 XML이 테스트 리소스에 있고 yaml도 내 테스트에 포함됨) 이러한 주문 및 요청 값이 설정되고, 그러나 그들은 null입니다. 또한, 내 yaml에는 @Value ($ {...})를 사용하여 주입하는 다른 값이 있으며, 절대적으로 좋게 주입됩니다!

나는 이것을 보았다 : Spring Boot - application.yml로부터 맵 삽입하기

나는 거의 동일하게했으나, 아직 나의 가치는 설정되어 있지 않습니다. 친절하게 도와주세요.

나는 google을 통해이 링크를 찾았습니다. http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/beans/factory/config/YamlPropertiesFactoryBean.html

여기에는 모든 것이 문자열이 아니라지도로 읽혀집니다. 여기 Yaml 파일을 읽는 것을 지원하는 다른 클래스가 있습니까? Spring Boot - application.yml에서 맵 주입

아니면 YamlPropertiesFactoryBean에 대한 나의 이해가 잘못 되었습니까?

compile 'org.springframework:spring-core:4.2.+'
compile 'org.springframework:spring-beans:4.2.+'
compile 'org.springframework:spring-context:4.2.+'
compile 'org.springframework.boot:spring-boot:1.3.1.RELEASE'
compile 'org.springframework.boot:spring-boot-configuration-processor:1.3.1.RELEASE'

이들은 gradle의 의존성입니다. 본질적으로 스프링 부트를 원하지 않는다는 것에 궁금해 할 것입니다.하지만 스프링 부트가 없으면 @EnableConfigurationProperties 및 @ConfigurationProperties를 추가하지 않을 것입니다. 솔직하게 말하면 yaml 콘텐츠를지도없이 읽을 수 있는지 확인합니다. 따라서이 두 가지 종속성이 추가되지만 제거 할 수있는 방법이있는 경우 두 가지 종속성을 제거하는 것이 더 이상 행복 할 것입니다.

따뜻한 안부, Pavan

해결법

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

    1.다른 제네릭 형식에서도 동일한 문제가 발생했으며 맵 멤버를 초기화하고 setter 메서드를 제거하여 해결했습니다 (예 :

    다른 제네릭 형식에서도 동일한 문제가 발생했으며 맵 멤버를 초기화하고 setter 메서드를 제거하여 해결했습니다 (예 :

    @Component
    @EnableConfigurationProperties
    @ConfigurationProperties(prefix = "countries")
    public class UserLimitReader{
        private Map<String, Integer> orders = new HashMap<>();
    
        private Map<String, Integer> requests = new HashMap<>();
    
        public Map<String, Integer> getOrders() {
            return orders;
        }
        ...
    }
    

    Java 7 다이아몬드 연산자를 사용하고 HashMap 대신 Map에 멤버 유형을 변경합니다.

    중요 : 코드에서는 XML 대신 Spring의 구성 클래스를 사용하고 EnableConfigurationProperties를 구성 클래스로 이동했습니다. 귀하의 경우 그것은 다음과 같아야합니다 :

    @Configuration
    @EnableConfigurationProperties(value = {UserLimitReader.class})
    public class SpringConfiguration {
        ...
    }
    
    @ConfigurationProperties(prefix = "countries", locations: "classpath:config/application.yaml")
    public class UserLimitReader {
        ...
    }
    

    XML을 사용하여 구성하는 방법을 모르겠다. 그러나 내 의견에 썼을 때, 나는 여전히 Spring이 컴포넌트 스캔이나 비슷한 것을 사용하여 클래스를 찾도록해야한다고 생각한다.

    Spring에서의 @Value 작업은 컨텍스트 파일을 사용하여 아무 문제없이 YAML 파일을로드하지만 Spring에서 UserLimitReader 파일을로드하고 구성한다는 의미는 아닙니다.

  2. from https://stackoverflow.com/questions/34697611/reading-a-map-from-yaml-in-java-getting-null by cc-by-sa and MIT license