Spring Boot使用@Value读取含全限定类名key的yml配置报错如何解决
Spring Boot YML带特殊字符Key配置读取解决方案
错误原因
- 根节点不匹配:你的YML配置根节点为
stack,示例中@Value使用outstack作为前缀,存在拼写错误。 - 带
.的Key未转义:Spring默认将配置路径中的.识别为层级分隔符,com.cloudimpl.outstack.runtime.EventRepositoryFactory是完整的单层Key,内部的.会被误判为层级拆分,导致路径解析失败。 - 数组未指定下标:
com.cloudimpl.outstack.runtime.EventRepositoryFactory对应的配置值为数组类型,必须指定数组下标(从0开始计数)才能读取对应元素的属性。
解决方法
方法1:修正@Value路径写法
将带.的完整Key用['']包裹,同时补充数组下标。例如读取EventRepositoryFactory下第二个(status为active的PostgresRepositoryFactory)的name属性,写法如下:
@Value("${stack.providers['com.cloudimpl.outstack.runtime.EventRepositoryFactory'][1].name}") private String repoFactoryName;
如果需要读取第一个元素MemRepositoryFactory的name,将下标[1]改为[0]即可。
方法2:使用@ConfigurationProperties批量绑定(更推荐)
针对复杂层级的配置,更推荐用配置绑定类规避路径转义问题,示例代码如下:
import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; @ConfigurationProperties(prefix = "stack") @Component public class StackProperties { private Map<String, List<ProviderConfig>> providers; // 其他stack下的配置字段可以在这里补充 public Map<String, List<ProviderConfig>> getProviders() { return providers; } public void setProviders(Map<String, List<ProviderConfig>> providers) { this.providers = providers; } public static class ProviderConfig { private String name; private String impl; private String status; private Map<String, Object> configs; // 自行补充getter、setter方法 } }
注入该类后即可直接获取所有provider配置,无需处理特殊字符转义:
@Autowired private StackProperties stackProperties; // 读取对应配置的示例 String postgresName = stackProperties.getProviders() .get("com.cloudimpl.outstack.runtime.EventRepositoryFactory") .get(1) .getName();
内容的提问来源于stack exchange,提问作者dasitha
相关产品推荐
相关产品推荐

