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.