能否在networknt/json-schema-validator中覆盖maximum关键字验证逻辑?
在networknt/json-schema-validator中覆盖
maximum关键字验证逻辑 要实现像AJV那样让maximum支持$data引用(字符串/JSON指针),不能直接添加同名自定义关键字(内置关键字优先级更高),必须替换内置的maximum关键字处理器,具体步骤如下:
1. 自定义maximum验证器
实现Validator接口,同时处理普通数值和$data引用两种场景:
public class CustomMaximumValidator implements Validator { @Override public void validate(ValidationContext validationContext, JsonNode node, JsonNode rootNode, String at) { JsonNode maximumNode = validationContext.getCurrentSchema().get("maximum"); if (maximumNode == null) return; Number maxValue; // 处理$data引用场景 if (maximumNode.isTextual() && maximumNode.asText().startsWith("$data")) { JsonNode referencedNode = resolveDataReference(maximumNode.asText(), rootNode); if (referencedNode == null || !referencedNode.isNumber()) { validationContext.addError(at, "maximum的$data引用无效或指向非数值"); return; } maxValue = referencedNode.numberValue(); } // 处理普通数值场景 else if (maximumNode.isNumber()) { maxValue = maximumNode.numberValue(); } // 非法参数场景 else { validationContext.addError(at, "maximum必须是数值或有效的$data引用"); return; } // 执行数值校验逻辑 if (!node.isNumber()) return; Number nodeValue = node.numberValue(); if (nodeValue.doubleValue() > maxValue.doubleValue()) { validationContext.addError(at, String.format("数值不能大于%s", maxValue)); } } // 解析$data引用,这里实现绝对JSON指针的解析,可按需扩展相对路径 private JsonNode resolveDataReference(String dataRef, JsonNode rootNode) { String pointer = dataRef.replace("$data#", ""); try { return rootNode.at(pointer); } catch (IllegalArgumentException e) { return null; } } }
2. 替换内置验证器
通过SchemaValidatorsConfig移除内置的maximum验证器,再注册自定义实现:
// 创建配置实例 SchemaValidatorsConfig config = new SchemaValidatorsConfig(); // 移除原有maximum验证器 config.getValidators().remove("maximum"); // 注册自定义验证器 config.addValidator("maximum", new CustomMaximumValidator()); // 使用配置初始化验证器 SchemaValidator validator = new SchemaValidator(config);
3. 关键注意点
- 测试时要覆盖两种场景:普通数值的
maximum校验,以及$data引用的校验,确保原有功能不受影响; $data引用的解析逻辑可根据需求扩展,比如支持相对当前节点的路径;- 如果需要
exclusiveMaximum也支持$data,可采用完全相同的方式替换其内置验证器。
内容的提问来源于stack exchange,提问作者user1630923
相关产品推荐
相关产品推荐

