次の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」)を引用してみましたが、役に立ちませんでした-まだ同じ問題です。これを回避する方法はありますか?
Spring Boot 1.4.3.RELEASEで動作する@fivetenwillの回答のわずかな改訂:
foo:
"[bar.com]":
a: b
"[baz.com]":
a: c
括弧は引用符の中にある必要があります。そうしないと、YAMLパーサーは基本的にSpringに到達する前にそれらを破棄し、プロパティ名に入れません。
これは、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
}
}