使用SnakeYAML解析YAML映射数组到Java对象时遭遇类型不匹配错误的解决方案咨询
SnakeYAML解析YAML映射数组到Java对象时遭遇类型不匹配错误的解决方案咨询
我正在开发一个告警规则引擎,核心功能是用SnakeYAML把YAML格式的告警配置文件解析成Java对象。目前在解析suppressionAlarms字段时碰到了类型不匹配的错误,折腾了好一阵没搞定,想请教社区的大佬们帮忙看看问题出在哪,该怎么解决。
问题场景与配置示例
我的YAML配置文件片段是这样的:
alarmThreshold: 0 alarmClearThreshold: 20 suppressionAlarms: - source: suppSource name: suppName
其中suppressionAlarms是一个包含source和name键值对的映射列表。
Java类结构(核心部分)
我用Lombok注解定义了对应的Java类,核心类是AlarmRuleFile,里面suppressionAlarms字段的类型是SuppressionRuleSetModel,这个类继承自泛型父类AbstractRuleSetModel。下面是关键类的简化代码:
1. AlarmRuleFile
@Data @EqualsAndHashCode(exclude = {"comment"}) @NoArgsConstructor @AllArgsConstructor @Builder(toBuilder = true) public class AlarmRuleFile { private String comment; private BasicRuleSetModel alarmThreshold; private BasicRuleSetModel alarmClearThreshold; private SuppressionRuleSetModel suppressionAlarms; // 其他无关字段已省略 }
2. SuppressionRuleSetModel 与父类
// SuppressionRuleSetModel.java @Data @NoArgsConstructor @EqualsAndHashCode(callSuper = true) public class SuppressionRuleSetModel extends AbstractRuleSetModel<SuppressionRuleModel, List<SuppressionAlarmModel>> { public SuppressionRuleSetModel(List<SuppressionAlarmModel> defaultValue) { super(defaultValue); } public SuppressionRuleSetModel(List<SuppressionRuleModel> rules, List<SuppressionAlarmModel> defaultValue) { super(rules, defaultValue); } } // AbstractRuleSetModel.java @Data @AllArgsConstructor @NoArgsConstructor @SuperBuilder(toBuilder = true) public abstract class AbstractRuleSetModel<R extends AbstractRuleModel<?>, D> { private List<R> rules; private D defaultValue; public AbstractRuleSetModel(D defaultValue) { this.defaultValue = defaultValue; } // 其他方法已省略 }
3. 关联的模型类
SuppressionAlarmModel是对应YAML中单个映射的简单模型类,包含source和name两个字符串字段(结构简单,代码就不贴了)。
错误详情
当我运行测试用例解析YAML时,SnakeYAML抛出了类型不匹配的异常,关键错误信息如下:
=> Cannot create property=suppressionAlarms for JavaBean=AlarmRuleFile(comment=null, alarmThreshold=BasicRuleSetModel(), alarmClearThreshold=BasicRuleSetModel(), suppressionAlarms=null) in 'reader', line 1, column 1: alarmThreshold: 0 ^ java.lang.IllegalArgumentException: argument type mismatch in 'reader', line 7, column 20: suppressionAlarms: [ { source: suppSource, name: su ... ^
我做过的尝试
目前我的SnakeYAML的DumperOptions配置是这样的:
private DumperOptions getDumperOptions() { DumperOptions options = new DumperOptions(); options.setDefaultFlowStyle(FlowStyle.AUTO); options.setPrettyFlow(false); options.setIndent(4); return options; }
我猜测问题出在:YAML中的suppressionAlarms是一个列表,但Java中对应的SuppressionRuleSetModel是一个包含rules和defaultValue的容器类,SnakeYAML不知道怎么直接把YAML列表映射到这个容器类上。
想请教的问题
- 是我的Java类结构设计有问题吗?应该怎么调整才能让SnakeYAML正确解析?
- 如果类结构不能大改,有没有办法通过自定义SnakeYAML的构造器或者类型转换器来解决这个映射问题?
麻烦大家帮忙分析一下,谢谢啦!
内容来源于stack exchange
相关产品推荐
相关产品推荐

