Quarkus中MicroProfile ConfigMapping转换器无法返回完整对象问题排查
我的YAML配置如下:
my: filter: number-range: - range: from: +994700110000 to: +994700110002
对应的ConfigMapping定义:
@ConfigMapping(prefix = "my.filter") public interface SmsGatewayFilterListConfig { List<RangeWrapper> numberRange(); }
相关POJO类:
public record RangeWrapper(Range range) { } public record Range(String from, String to) { }
我还实现了转换器并注册在META-INF/services/org.eclipse.microprofile.config.spi.Converter中:
import org.eclipse.microprofile.config.spi.Converter; import org.yaml.snakeyaml.Yaml; public class RangeWrapperConverter implements Converter<RangeWrapper> { @Override public RangeWrapper convert(String s) throws IllegalArgumentException, NullPointerException { System.out.println("Got: " + s); return new Yaml().loadAs(s, RangeWrapper.class); } }
项目已引入quarkus-config-yaml依赖,使用application.yml作为配置文件。但启动Quarkus应用时出现解析问题,传递给转换器的字符串为:
{"number-range": [{"range": {"from": "+994700110000"
该字符串为不完整的JSON格式,请问问题出在哪里?
核心问题:Converter使用场景错误
你给RangeWrapper注册了全局Converter,但Quarkus的@ConfigMapping本身原生支持复杂对象和集合的自动绑定,完全不需要额外的Converter。当@ConfigMapping和自定义Converter同时存在时,框架会错误地将配置段的部分内容当作字符串传递给Converter,进而出现截断的不完整JSON片段。
解决步骤
移除自定义Converter
- 删除
RangeWrapperConverter类 - 删除
META-INF/services/org.eclipse.microprofile.config.spi.Converter中对应的注册条目
- 删除
确认命名匹配正确性
配置中的number-range对应接口的numberRange()方法,符合MicroProfile Config的驼峰命名转换规则,无需修改。验证自动绑定
移除Converter后,Quarkus会自动将YAML中number-range数组绑定到List<RangeWrapper>,每个数组元素会自动映射到RangeWrapper和Range记录类,无需手动解析。
为什么会出现不完整字符串?
当框架检测到RangeWrapper类型的Converter时,会尝试将my.filter.number-range下的内容序列化为字符串传递给Converter,但在处理集合时出现了截断逻辑,导致传递了不完整的JSON片段——这是@ConfigMapping和自定义Converter冲突引发的异常行为。
内容的提问来源于stack exchange,提问作者mangusbrother

