복붙노트

[SPRING] Spring Boot에서 Yaml의 Map 키에서 도트를 이스케이프 처리

SPRING

Spring Boot에서 Yaml의 Map 키에서 도트를 이스케이프 처리

나는 다음과 같은 yml 설정을 가지고있다 :

foo:
  bar.com:
    a: b
  baz.com:
    a: c

다음 클래스를 사용하여 Spring은 키 'bar'와 'baz'가있는 맵을 주입하려고 시도하며, 도트를 구분 기호로 처리합니다.

public class JavaBean {
    private Map<String, AnotherBean> foo;
(...)
}

열쇠 (예 : 'bar.com'또는 'bar.com')를 인용하려고했지만 아무 소용이 없는지 - 여전히 동일한 문제입니다. 이 문제를 해결할 방법이 있습니까?

해결법

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

    1.스프링 부트 1.4.3에서 나에게 맞는 @ fivetenwill의 답변의 약간의 개정. 릴리 :

    스프링 부트 1.4.3에서 나에게 맞는 @ fivetenwill의 답변의 약간의 개정. 릴리 :

    foo:
      "[bar.com]":
        a: b
      "[baz.com]":
        a: c
    

    따옴표 안에 괄호가 있어야합니다. 그렇지 않으면 YAML 파서는 기본적으로 스프링에 도달하기 전에 파서를 버리고 속성 이름에 넣지 않습니다.

  2. ==============================

    2.yaml 키를 Java bean 속성에 자동 맵핑하려는 경우에는 불가능합니다. 이유는, Spring은 먼저 YAML을 속성 형식으로 변환합니다. 아래 링크의 24.6.1 절을 참조하십시오 :

    yaml 키를 Java bean 속성에 자동 맵핑하려는 경우에는 불가능합니다. 이유는, Spring은 먼저 YAML을 속성 형식으로 변환합니다. 아래 링크의 24.6.1 절을 참조하십시오 :

    https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html

    따라서 YAML은 다음으로 변환됩니다.

    foo.bar.com.a=b
    foo.baz.com.a=c
    

    위의 키는 표준 속성으로 파싱됩니다.

    해결 방법은 Spring의 YamlMapFactoryBean을 사용하여 Yaml Map을 그대로 만들 수 있습니다. 그런 다음이 맵을 사용하여 직접 Java bean을 작성할 수 있습니다.

    @Configuration
    public class Config {
    
        private Map<String, Object> foo;
    
        @Bean
        public Map<String, Object> setup() {
            foo = yamlFactory().getObject();
            System.out.println(foo); //Prints {foo={bar.com={a=b}, baz.com={a=c}}}
            return foo;
        }
    
        @Bean
        public YamlMapFactoryBean yamlFactory() {
            YamlMapFactoryBean factory = new YamlMapFactoryBean();
            factory.setResources(resource());
            return factory;
        }
    
        public Resource resource() {
            return new ClassPathResource("a.yaml"); //a.yaml contains your yaml config in question
        }
    
    }
    
  3. ==============================

    3.이것은 작동해야합니다 :

    이것은 작동해야합니다 :

    foo:
      ["bar.com"]:
        a: b
      ["baz.com"]:
        a: c
    

    스프링 부트 구성에서 영감을 얻습니다.

  4. from https://stackoverflow.com/questions/34070987/escaping-a-dot-in-a-map-key-in-yaml-in-spring-boot by cc-by-sa and MIT license