如何在Micronaut中使用含特殊字符的字符串作为YAML键
问题:含特殊字符的YAML Map键无法通过@ConfigurationProperties正确绑定
我的application.yaml配置如下:
env: emails: a: 0 # works, the rest don't "b.com": 0 "c.com": 1 "d.com": 0 'e.com': 1 "[f.com]": 0 '[g.com]': 1
使用如下类读取该配置:
@ConfigurationProperties("env") public class Configurator { private Map<String, Double> emails; public Map<String, Double> getEmails() { return emails; } public void setEmails( @MapFormat(keyFormat = StringConvention.RAW) Map<String, Double> emails) { this.emails = emails; } }
当前Map<String, Double> emails仅包含一个条目:a : 0,其余含特殊字符的键无法正确映射。已尝试在setter方法中使用@MapFormat(keyFormat = StringConvention.RAW),但问题仍未解决。
此外,以下application.yaml格式可正常工作,但不清楚如何在不使用TypeConverter的情况下,通过@ConfigurationProperties直接将其绑定到Map<String, Double>:
env: emails: - key: a.com value: 0
请问如何让含特殊字符的字符串键正确映射?
解决方案
方法1:调整@MapFormat注解位置并确保YAML键格式正确
将@MapFormat(keyFormat = StringConvention.RAW)注解直接标注在emails字段上,而非setter方法的参数上,Spring就能正确识别含特殊字符的原始键名:
修改后的Configurator类:
@ConfigurationProperties("env") public class Configurator { @MapFormat(keyFormat = StringConvention.RAW) private Map<String, Double> emails; public Map<String, Double> getEmails() { return emails; } public void setEmails(Map<String, Double> emails) { this.emails = emails; } }
对应的application.yaml保持原格式即可(确保特殊键用单/双引号包裹)。
方法2:使用YAML方括号键语法
对于含特殊字符的键,也可以用方括号直接包裹键名,这种写法无需额外注解就能被Spring正确解析为原始字符串:
env: emails: a: 0 [b.com]: 0 [c.com]: 1 [d.com]: 0 [e.com]: 1 [[f.com]]: 0 [[g.com]]: 1
关于数组式YAML的绑定说明
你提到的数组结构YAML本质是List<Map<String, Object>>,若要直接绑定到Map<String, Double>,必须自定义类型转换器。推荐优先使用前面两种Map原生格式的写法,避免额外的转换逻辑。
内容的提问来源于stack exchange,提问作者FIREWORKKS
相关产品推荐
相关产品推荐

