You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 11:23:31