Устранение точки в ключе карты в Yaml в Spring Boot
У меня есть следующий yml config:
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
Небольшая версия ответа @fivetenwill, которая работает для меня в Spring Boot 1.4.3.RELEASE:
foo:
"[bar.com]":
a: b
"[baz.com]":
a: c
Вам нужно, чтобы скобки были внутри кавычек, иначе парсер YAML в основном отбрасывает их до того, как они доберутся до Spring, и они не попадают в имя свойства.
Ответ 2
Это невозможно, если вы хотите автоматическое сопоставление ключей 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
для создания карты YamlMapFactoryBean
как есть. Затем вы можете использовать эту карту для создания Java-компонентов самостоятельно.
@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
Это должно работать:
foo:
["bar.com"]:
a: b
["baz.com"]:
a: c
Вдохновленный от Spring конфигурации загрузки Binding Wiki