Spring Boot 3.1.4中Map嵌套复杂类型无法生成配置元数据求助
在Spring Boot 3.1.4版本中,使用spring-boot-configuration-processor生成配置元数据时,遇到Map类型就会停止解析,无法生成嵌套复杂类型(比如Map的值为自定义配置属性类)的元数据。虽然多层嵌套配置功能本身运行正常,但我依赖元数据驱动用户环境配置向导,导致这个处理器库几乎无法满足需求。在自行开发工具前,想确认是否有遗漏的配置或官方支持的解决思路。
依赖配置
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency>
示例代码
配置属性类
@ConfigurationProperties(prefix = "cache.cfg") public class CacheCfgProps { /** * Cache properties map. Cache Name is the key. */ @Getter private HashMap<String, CacheProps> cachePropsMap = new HashMap<>(); } @Getter public class CacheProps { /** * Cache Name. */ private String name; /** * Record statistics */ private Boolean recordStats = true; /** * Initial capacity. Warmup placeholder. */ private Integer initialCapacity = 200; /** * Maximum size/entries. */ private Long maximumSize = 1000L; /** * Expire calculated from last access. */ }
配置示例
cache.cfg.cache-props-map.default.name=default cache.cfg.cache-props-map.default.max-size=1000 cache.cfg.cache-props-map.c1.name=c1 cache.cfg.cache-props-map.c1.max-size=500 cache.cfg.cache-props-map.c2.name=c2 cache.cfg.cache-props-map.c2.max-size=10000
目前Spring Boot的configuration-processor对Map值为复杂类型的元数据生成支持确实有限,官方文档也未明确提及这类场景的处理方式,可尝试以下几种方案:
手动补充配置元数据
在META-INF目录下创建spring-configuration-metadata.json文件,手动定义Map嵌套属性的元数据。针对上述示例,可添加如下内容(注意替换实际包路径):{ "properties": [ { "name": "cache.cfg.cache-props-map", "type": "java.util.Map<java.lang.String, com.yourpackage.CacheProps>", "description": "Cache properties map. Cache Name is the key.", "properties": [ { "name": "name", "type": "java.lang.String", "description": "Cache Name." }, { "name": "record-stats", "type": "java.lang.Boolean", "description": "Record statistics", "defaultValue": true }, { "name": "initial-capacity", "type": "java.lang.Integer", "description": "Initial capacity. Warmup placeholder.", "defaultValue": 200 }, { "name": "maximum-size", "type": "java.lang.Long", "description": "Maximum size/entries.", "defaultValue": 1000 } ] } ] }手动定义后,配置向导就能识别嵌套属性。
改用List替代Map(业务允许的话)
如果业务场景可接受,将Map结构改为List:@ConfigurationProperties(prefix = "cache.cfg") public class CacheCfgProps { @Getter private List<CacheProps> caches = new ArrayList<>(); }对应配置调整为:
cache.cfg.caches[0].name=default cache.cfg.caches[0].max-size=1000 cache.cfg.caches[1].name=c1 cache.cfg.caches[1].max-size=500这种结构下
configuration-processor能正常生成完整元数据。自定义处理器扩展
若上述方案都不满足需求,可基于Spring Boot的SPI机制自定义元数据生成器。实现ConfigurationMetadataSourceProcessor接口,处理Map类型的嵌套属性,解析其值类型的字段并生成对应元数据。不过这种方式需要熟悉Spring Boot元数据生成机制,开发成本较高。
内容的提问来源于stack exchange,提问作者Buks van der Lingen

