Malli中malli.error/humanize的概念及具体作用是什么
malli.error/humanize 功能说明 直接给明确结论:
- 它的核心作用是将Malli校验生成的原始错误数据转换为易读格式的输出工具,不是Java中那种专门用来注册自定义错误语句的机制。
- 自定义错误文案是在Schema定义阶段通过配置项完成的,
humanize属于错误处理链路的末端渲染层,负责把所有校验错误(包括内置默认错误、用户自定义错误)整理成和原数据结构对齐、无冗余内部字段、文案直白的结果,方便直接用来做表单提示、接口错误返回等面向用户的场景。
示例逻辑对应
你提供的代码刚好能印证它的作用,整个执行链路分三步:
m/explain对传入的Address结构做全量校验,这一步返回的原始结果包含大量机器处理用的内部字段,比如错误路径编码、校验器标识、Schema元数据等,结构复杂不适合直接展示。me/humanize接收到原始校验结果后,会自动完成三个处理:- 错误位置和原数据结构完全对齐,比如嵌套在
:address下的:city字段错误、:lonlat数组第二个元素的错误,输出层级和输入数据完全一致,不需要额外做路径映射 - 将内部错误标识转换为直白的自然语言文案,比如把缺失必填键的内部标识转换为
"missing required key",把类型不匹配的内部标识转换为"should be a double" - 过滤所有用户不需要感知的内部元数据,只保留可读的错误内容
- 错误位置和原数据结构完全对齐,比如嵌套在
- 最终输出的结果可以直接用于前端错误展示,不需要额外做格式转换。
补充说明:如果需要自定义错误提示文案,只需要在定义对应Schema时通过
:message配置即可,humanize会自动读取配置的自定义文案输出,不需要修改humanize本身的逻辑。
对应示例代码:
(require '[malli.error :as me]) (-> Address (m/explain {:id "Lillan" :tags #{:artesan "coffee" :garden} :address {:street "Ahlmanintie 29" :zip 33100 :lonlat [61.4858322, nil]}}) (me/humanize)) ;{:tags #{["should be a keyword"]} ; :address {:city ["missing required key"] ; :lonlat [nil ["should be a double"]]}}
内容的提问来源于stack exchange,提问作者Blaze
相关产品推荐
相关产品推荐

