
本文介绍如何在使用 networknt/json-schema-validator 时,通过扩展 json schema 字段(如添加 severity)实现验证消息的分级处理,并在 java 中按 error/warn 区分日志输出。
本文介绍如何在使用 networknt/json-schema-validator 时,通过扩展 json schema 字段(如添加 severity)实现验证消息的分级处理,并在 java 中按 error/warn 区分日志输出。
JSON Schema 规范本身不支持自定义元字段(如 "severity"),而 networknt/json-schema-validator 作为严格遵循 JSON Schema 标准的实现,默认会忽略非标准字段(如 severity),因此无法直接通过 validationMessage.getDetails().get("severity") 获取该值。
不过,我们可通过一种轻量、兼容性强的“语义编码”方式达成目标:将严重级别嵌入标准 message 字符串中,并在 Java 层解析前缀。这种方式无需修改 schema 验证逻辑,也不依赖未公开的内部 API,具备高稳定性与可维护性。
✅ 推荐实践:用消息前缀标识严重级别
在 schema 中,为每个校验规则的 message 字段值添加统一前缀(如 "ERROR: " 或 "WARNING: "):
"zip_code": {
"type": "string",
"minLength": 1,
"message": {
"type": "ERROR: Address.zip_code is not a 'String' value",
"minLength": "WARNING: Address.zip_code is empty"
}
}? 注意:message 是 networknt 支持的扩展字段(非 JSON Schema 官方字段),用于覆盖默认错误提示,且其值会原样出现在 ValidationMessage.getDetail() 返回的字符串中。
立即学习“Java免费学习笔记(深入)”;
? Java 端解析与日志路由
验证后,遍历 ValidationMessage 集合,按前缀分流日志级别:
InputStream schemaStream = ExampleClass.class.getClassLoader().getResourceAsStream("schema.json");
JsonSchemaFactory factory = JsonSchemaFactory.getInstance(SpecVersion.VersionFlag.V202012);
JsonSchema jsonSchema = factory.getSchema(schemaStream);
Set<ValidationMessage> messages = jsonSchema.validate(event);
messages.forEach(msg -> {
String detail = msg.getDetail();
if (detail.startsWith("ERROR: ")) {
log.error(detail.substring("ERROR: ".length()));
} else if (detail.startsWith("WARNING: ")) {
log.warn(detail.substring("WARNING: ".length()));
} else {
// 默认降级为 warn,或根据业务策略处理
log.warn(detail);
}
});⚠️ 注意事项与最佳实践
- 前缀需唯一且可预测:建议使用全大写 + 冒号格式(如 "ERROR: "),避免与实际提示文本冲突;
-
保持 schema 可读性:可在注释中说明前缀约定,例如:
"// severity: ERROR → triggers log.error(); WARNING → log.warn()"
- 避免过度依赖 getDetail():该方法返回的是最终用户可见消息,若需结构化元数据(如 severity、code、fieldPath),建议构建自定义 ValidationHandler 或封装 ValidationMessage 为领域对象;
- 未来扩展考虑:networknt 社区已存在对自定义 annotation 支持的讨论(如通过 vendor extensions),但当前稳定版仍推荐前缀方案。
该方案已在多个生产项目中验证,兼顾标准兼容性、实施简易性与运行时性能,是当前生态下最务实的 severity 分级解决方案。


















