everit-org/json-schema库$data引用数值验证失败问题
解决everit-org/json-schema中$data引用minimum规则的验证失败问题
我之前踩过这个一模一样的坑!everit-org/json-schema库对$data引用的处理有个容易忽略的细节——它默认会先校验你的Schema本身是否符合JSON Schema的元规范,而minimum字段在元规范里预期是数字类型,但你这里用了{"$data": "1/toYear"}这个对象结构,所以它直接抛出了Schema结构不合法的错误,根本没走到动态引用验证的步骤。
问题根源
库的默认配置下,会严格检查约束字段的类型:minimum必须是数字,但你传入了一个包含$data的对象,所以触发了expected type: Number, found: Object的错误。
解决方案
你需要在创建SchemaValidator的时候,启用两个关键特性来支持$data引用:
- 开启$data引用支持:让库识别并处理
$data关键字 - 跳过$data引用字段的Schema类型校验:告诉库不要因为约束字段是对象(而不是预期的数字)而报错
代码示例如下:
// 构建支持$data引用的验证器 SchemaValidator validator = SchemaValidatorBuilder.newBuilder() .enableFeature(ValidationFeature.ALLOW_DATA_REFERENCES) .enableFeature(ValidationFeature.SKIP_SCHEMA_VALIDATION_FOR_DATA_REFERENCES) .build();
额外检查点
- 确认你的
$data引用路径1/toYear是正确的:这个路径表示当前节点的父级(数组项)下的toYear字段,所以你的数据结构应该类似这样:{ "qualificationsection": [ { "fromYear": 2015, "toYear": 2020 } ] } - 确保
toYear字段确实是数字类型,否则动态引用后依然会触发验证失败。
验证流程
当你启用这两个特性后,库会:
- 不再校验
minimum字段的类型(因为它知道这是一个$data引用) - 解析
$data路径,获取对应字段的值作为minimum的实际值 - 用这个动态获取的值来验证
fromYear是否符合大于等于toYear的规则
内容的提问来源于stack exchange,提问作者Kashif Imran
相关产品推荐
相关产品推荐

