Java Spring

发布于

AI总结: 本文介绍了在使用 @ConfigurationProperties 绑定 Map 时,Spring Boot 的松散绑定机制会移除 Key 中的特殊字符,如斜杠和中划线。为保留这些特殊字符,用户需要在配置文件中使用方括号语法。YAML 和 Properties 的配置示例均展示了如何正确使用方括号来包裹 Key,并强调必须使用双引号包裹整个 Key。Java 代码示例展示了如何接收这些配置。最后,解释了斜杠丢失的原因,指出松散绑定规则会将某些字符视为非法字符并剔除,使用方括号可以避免这一问题。改进建议是提供更多关于方括号使用的示例和常见错误的解决方案,以帮助用户更好地理解和应用这一机制。

在使用 @ConfigurationProperties 绑定 Map 时,Spring Boot 的 松散绑定 (Relaxed Binding) 机制会默认移除 Key 中的特殊字符(如斜杠 /、中划线 - 等)以进行规范化处理。

解决方案:使用方括号 [] 包裹 Key
要保留 Key 中的斜杠或其他特殊字符,你必须在配置文件(YAML 或 Properties)中使用 方括号语法。
1. YAML 配置示例

my:  
  config:  
    map:  
      "[/api/v1/user]": "value1"  
      "[/auth/login]": "value2"  
  • 关键点:必须使用双引号包裹整个 Key,且 Key 内部使用 []。

  • Properties 配置示例

my.config.map.[/api/v1/user]=value1  
my.config.map.[/auth/login]=value2  
  1. Java 代码接收
@Component  
@ConfigurationProperties(prefix = "my.config")  
public class MyProperties {  
    private Map<String, String> map;  
    // getter and setter  
}  

为什么斜杠会丢失?
Spring Boot 在处理 Map 的 Key 时,如果 Key 没有被 [] 包裹,它会尝试应用松散绑定规则。在此规则下: [1, 2]

  • / 会被视作路径分隔符或非法字符被剔除。
  • my-key 会被转为 myKey。
  • 使用 [] 可以显式告诉 Spring “这是一个字面量 Key”,从而跳过松散绑定逻辑,原样保留所有字符。