Clojure prismatic/schema强制的默认值,而不是错误消息
使用prismatic/schema强制可以在强制失败时使用默认值,而不是错误消息 我在csv文件中有一个值,它可以是空白(nil)或s/Int。目前,通过以下代码,我得到了空白值:Clojure prismatic/schema强制的默认值,而不是错误消息,clojure,plumatic-schema,Clojure,Plumatic Schema,使用prismatic/schema强制可以在强制失败时使用默认值,而不是错误消息 我在csv文件中有一个值,它可以是空白(nil)或s/Int。目前,通过以下代码,我得到了空白值: #schema.utils.ErrorContainer{:error (not (integer? nil))} 代码: 一,。您得到的错误不是强制错误,而是验证错误。值必须符合初始架构 二,。要修复它,您需要为可能是nil的字段释放模式。假设它是第二个字段: (def answers-field-schem
#schema.utils.ErrorContainer{:error (not (integer? nil))}
代码:
一,。您得到的错误不是强制错误,而是验证错误。值必须符合初始架构 二,。要修复它,您需要为可能是
nil
的字段释放模式。假设它是第二个字段:
(def answers-field-schemas [s/Int (s/maybe s/Int) ...])
此时,您将获得nil
s,而不是nil
字段的错误:
user> (answers-coerce-fields ["1" nil])
[1 nil]
三,。如果强制后确实需要默认值而不是nil
s,则需要自定义强制匹配器。大概是这样的:
(import 'schema.core.Maybe)
(defn field-matcher-with-default [default]
(fn [s]
(let [string-coercion-fn (or (coerce/string-coercion-matcher s)
identity)
maybe-coercion-fn (if (instance? schema.core.Maybe s)
(fnil identity default)
identity)]
(comp
string-coercion-fn
maybe-coercion-fn))))
还可以修改以前的强制器,如下所示:
(def answers-field-coercers
(mapv coerce/coercer
answers-field-schemas
;; your default here
(repeat (field-matcher-with-default -1))))
然后:
user> (answers-coerce-fields ["1" nil])
[1 -1]
请注意,默认值也必须符合schema,因此不能为schema(s/maybe s/Int)
设置类型为String
的默认值
user> (answers-coerce-fields ["1" nil])
[1 -1]