Устранение точки в ключе карты в 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
    }

}