yml visual studio run example configurationproperties code application spring spring-boot yaml

visual - Escape de un punto en una clave de mapa en Yaml en Spring Boot



spring visual studio (3)

Esto debería funcionar:

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

Inspirado en el enlace de configuración de arranque de Wiki

Tengo una siguiente configuración yml:

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

Con una clase siguiente, Spring intenta inyectar el mapa con las teclas ''bar'' y ''baz'', tratando los puntos como separador:

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

He intentado citar la clave (es decir, ''bar.com'' o "bar.com") pero fue en vano, sigue siendo el mismo problema. ¿Hay alguna forma de evitar esto?


Esto no es posible si desea la asignación automática de las claves yaml a los atributos del bean Java. La razón es que Spring convierte YAML primero en formato de propiedades. Vea la sección 24.6.1 del enlace a continuación:

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

Por lo tanto, su YAML se convierte a:

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

Las teclas de arriba se analizan como propiedades estándar.

Como YamlMapFactoryBean , puede utilizar el YamlMapFactoryBean de Spring para crear un mapa Yaml tal como está. Luego, puedes usar ese mapa para crear Java Beans por tu cuenta.

@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 } }


Una pequeña revisión de la respuesta de @fivetenwill, que me funciona en Spring Boot 1.4.3.RELEASE:

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

Necesita que los corchetes estén entre comillas, de lo contrario, el analizador YAML básicamente los descarta antes de que lleguen a Spring, y no ingresan en el nombre de la propiedad.