Vertx 5.0.2迁移时SchemaValidatorImpl触发Integer类型转换错误原因?
解决Vert.x 5.0.2 OpenAPIContract加载时Long转Integer类型转换错误
临时绕过方案
1. 手动修正JsonObject中的数值类型
在将spec.yaml解析为JsonObject后,递归遍历所有schema节点,把minProperties和maxProperties的Long值显式转为Integer:
// 假设已读取spec.yaml并解析为JsonObject specJson fixSchemaNumericTypes(specJson); private void fixSchemaNumericTypes(JsonObject json) { // 处理当前节点的minProperties/maxProperties if (json.containsKey("minProperties")) { json.put("minProperties", ((Number) json.getValue("minProperties")).intValue()); } if (json.containsKey("maxProperties")) { json.put("maxProperties", ((Number) json.getValue("maxProperties")).intValue()); } // 递归处理嵌套的JsonObject和JsonArray for (String key : json.fieldNames()) { Object value = json.getValue(key); if (value instanceof JsonObject) { fixSchemaNumericTypes((JsonObject) value); } else if (value instanceof JsonArray) { JsonArray array = (JsonArray) value; for (int i = 0; i < array.size(); i++) { Object elem = array.getValue(i); if (elem instanceof JsonObject) { fixSchemaNumericTypes((JsonObject) elem); } } } } }
修正完成后再将JsonObject传入OpenAPIContract.rxFrom(vertx, specJson)。
2. 自定义YAML解析规则
修改YAML解析器的配置,让它把范围内的整数直接解析为Integer而不是Long:
// 使用Jackson YAML自定义解析规则 YamlMapper yamlMapper = YamlMapper.builder() .nodeFactory(new JsonNodeFactory(true) { @Override public NumericNode numberNode(long value) { // 当数值在Integer范围内时,转为Integer节点 if (value >= Integer.MIN_VALUE && value <= Integer.MAX_VALUE) { return super.numberNode((int) value); } return super.numberNode(value); } }) .build(); // 读取并解析yaml文件 String yamlContent = vertx.fileSystem().readFileBlocking("spec.yaml").toString(); JsonNode yamlNode = yamlMapper.readTree(yamlContent); JsonObject specJson = JsonObject.mapFrom(yamlNode);
问题根源
这是Vert.x 5.x JSON Schema模块的内部bug:SchemaValidatorImpl代码中硬编码了minProperties的类型为Integer,但Vert.x默认的YAML解析器会将spec中的整数解析为Long,导致强制类型转换抛出ClassCastException。
长期处理建议
可以在Vert.x官方GitHub仓库提交issue跟进该问题的修复进度,等待官方发布修复版本后升级即可。
内容的提问来源于stack exchange,提问作者mac johnsto
相关产品推荐
相关产品推荐

