我写了一个宏
(defmacro defendpoint [msg-type url-key schema]
`(defrecord ~msg-type []
Create
(create [entity#]
(s/validate ~schema entity#)
(create-entity (~url-key urls) entity#))))我就像这样用它
(defendpoint Location :locations
{... my schema ...}})
(defendpoint LocationHierarchy :location-hierarchies
{... my schema ...}})当我第一次使用宏时,它就工作了。
(create (map->Location
{... data ...}))
=> { ... json response ...}但第二次失败:
(create (map->LocationHierarchy
{... data ...}))
=> 1. Unhandled java.lang.IllegalArgumentException
No implementation of method: :spec of protocol:
#'schema.core/Schema found for class: ohds.client$fn__32303我不知道为什么会这样。我预计第二个调用将以与第一个调用相同的方式工作,但在验证步骤中似乎出现了错误。事实上,如果我从宏中删除(s/validate...),它就会像预期的那样工作。所以我不确定到底是怎么回事。
发布于 2016-02-15 02:04:48
我要回顾一下我是如何解决我的问题的,希望这个方法能帮助别人。
tl;博士
;; Wrong:
(def date-schema (s/both s/Str #(re-matches #"my-regex" %)))
;; Right:
(def date-schema (s/both s/Str (s/pred #(re-matches #"my-regex" %))))方法
我从错误开始:No implementation of method: :spec of protocol: #'schema.core/Schema found for class: ohds.client$fn__32303
一开始我不知道这是什么意思。:spec of protocol:把我甩了。但我确实看到它提到了schema.core/Schema,所以我读了源代码。我发现Schema是一个带有spec方法的协议,就像错误说的那样:/
下一个令人困惑的部分是for class: ohds.client$fn__32303。我想知道为什么我的命名空间需要实现协议。那根本没道理。然后我注意到了$fn_32303。这告诉我,哪里有个小羊羔,哪里出了差错!
在这一点上,我的假设是我的模式有问题。因此,我从我的模式中删除了所有特殊的验证,并使用s/Str到处查看它是否有效。是的,所以我的位置是对的!我重新添加了特殊的验证,每次一个,直到测试再次失败。问题出在我的约会计划里。
我查看了我在上面定义的模式,看看有什么不同。在那里,我注意到我没有用s/pred包装我的羔羊。
道德
Clojure设计得很好,因此错误消息会准确地告诉您出了什么问题。你只需要理解它。
发布于 2018-07-31 16:53:42
就这样发生在我身上。原来我有一个引用自己的defschema:
(s/defschema Templates {:templates [Templates]
:error s/Bool})而不是正确的引用:
(s/defschema Templates {:templates [Template]
:error s/Bool})https://stackoverflow.com/questions/35399146
复制相似问题