首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不实现方法::协议规范:#'schema.core/Schema

不实现方法::协议规范:#'schema.core/Schema
EN

Stack Overflow用户
提问于 2016-02-14 23:07:42
回答 2查看 1.8K关注 0票数 4

我写了一个宏

代码语言:javascript
复制
(defmacro defendpoint [msg-type url-key schema]
  `(defrecord ~msg-type []
     Create
     (create [entity#]
       (s/validate ~schema entity#)
       (create-entity (~url-key urls) entity#))))

我就像这样用它

代码语言:javascript
复制
(defendpoint Location :locations
  {... my schema ...}})

(defendpoint LocationHierarchy :location-hierarchies
  {... my schema ...}})

当我第一次使用宏时,它就工作了。

代码语言:javascript
复制
(create  (map->Location
          {... data ...}))

=> { ... json response ...}

但第二次失败:

代码语言:javascript
复制
(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...),它就会像预期的那样工作。所以我不确定到底是怎么回事。

我创建了一个gist,它显示了我正在处理的整个文件

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-15 02:04:48

我要回顾一下我是如何解决我的问题的,希望这个方法能帮助别人。

tl;博士

代码语言:javascript
复制
;; 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设计得很好,因此错误消息会准确地告诉您出了什么问题。你只需要理解它。

票数 6
EN

Stack Overflow用户

发布于 2018-07-31 16:53:42

就这样发生在我身上。原来我有一个引用自己的defschema

代码语言:javascript
复制
(s/defschema Templates {:templates [Templates]
                        :error     s/Bool})

而不是正确的引用:

代码语言:javascript
复制
(s/defschema Templates {:templates [Template]
                        :error     s/Bool})
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35399146

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档