JSON Schema allOf结构中如何让自定义errorMessage生效
你使用的1.0.52版本json-schema-validator对自定义errorMessage扩展关键字的透传逻辑存在局限:仅根节点、not关键字包裹的校验节点上配置的errorMessage会被正常拾取,allOf、if/then/else这类组合 schema 内部节点配置的自定义错误默认不会被透传到最终返回结果中,这是你当前自定义提示不生效的核心原因。
另外你贴的if/then/else配置存在两处语法错误,也会导致配置不生效:
if块内required关键字和properties平级,不能嵌套在properties内部then、else块内的properties字段缺失前导引号
修正语法后的基础配置如下:
"if": { "required": ["x"] }, "then": { "properties": { "actions": { "maxItems": 2, "errorMessage": "x为true时actions数组最多可包含2项" } } }, "else": { "properties": { "actions": { "maxItems": 3, "errorMessage": "x为false时actions数组最多可包含3项" } } }
方案1:升级依赖版本(优先选择)
将json-schema-validator版本升级至1.0.73及以上,官方在该版本完整修复了组合关键字下errorMessage不生效的问题,升级后无需调整现有schema写法,allOf、if/then/else内部配置的自定义错误会被正常返回。
如果受依赖冲突限制无法升级到最新版,至少升级到1.0.67版本,该版本已加入对allOf、if/then/else场景下自定义错误消息的透传支持。
方案2:低版本兼容写法(无需改代码)
如果不能升级依赖,可以利用已验证生效的not关键字逻辑改写校验规则:把正向的数值上限校验,转换为反向的“不允许超过阈值”的校验,套在not结构中触发自定义消息拾取,示例写法如下:
"allOf": [ { "if": { "required": ["x"] }, "then": { "not": { "properties": { "actions": { "minItems": 3 } }, "errorMessage": "x为true时actions数组最多可包含2项" } } }, { "if": { "not": { "required": ["x"] } }, "then": { "not": { "properties": { "actions": { "minItems": 4 } }, "errorMessage": "x为false时actions数组最多可包含3项" } } } ]
该写法完全兼容1.0.52版本的错误消息拾取逻辑,不需要调整依赖或业务代码。
方案3:自定义消息拦截处理
如果上述方案都不适用,可以在初始化JsonSchema实例时注册自定义的校验结果处理器,遍历校验返回的ValidationMessage集合,根据错误路径、校验关键字、上下文参数手动替换为预设的自定义提示文本。该方案灵活度最高,但需要额外编写适配逻辑。
内容的提问来源于stack exchange,提问作者BpY

