web-dev-qa-db-ja.com

Spring BootでYamlのマップキーのドットをエスケープする

次の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」)を引用してみましたが、役に立ちませんでした-まだ同じ問題です。これを回避する方法はありますか?

25
theadam

Spring Boot 1.4.3.RELEASEで動作する@fivetenwillの回答のわずかな改訂:

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

括弧は引用符の中にある必要があります。そうしないと、YAMLパーサーは基本的にSpringに到達する前にそれらを破棄し、プロパティ名に入れません。

50
pioto

これは、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マップをそのまま作成できます。次に、そのマップを使用して、独自に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
    }

}
4
Mohit

これは動作するはずです:

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

Spring Boot Configuration Binding Wikiからの着想

1
fivetenwill