当前位置: 首页 > 知识库问答 >
问题:

没有实现方法d::协议规范:#'schema.core/Schema

武嘉祥
2023-03-14

我写了一个宏

(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…) 从宏中,它按预期工作。所以我不确定这里到底发生了什么。

我已经创建了一个要点,显示了我正在处理的整个文件


共有2个答案

水飞掣
2023-03-14

刚刚发生在我身上。原来我有一个引用自己的deschema

(s/defschema Templates {:templates [Templates]
                        :error     s/Bool})

而不是正确的参考:

(s/defschema Templates {:templates [Template]
                        :error     s/Bool})
谷光誉
2023-03-14

我将讲述我是如何解决我的问题的,希望这个方法能帮助别人。

tl; dr

;; 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" %))))

方法

我从错误开始:没有实现方法d::协议规范:#'schema.core/Schema找到类:ohds.client$fn__32303

起初我不确定这意味着什么。:协议规范:让我大吃一惊。但是我确实看到它提到了schema.core/Schema,所以我阅读了源代码。我发现模式是一个带有方法规范的协议,就像错误所说的:/

下一个让人困惑的部分是类的:ohds。客户端$fn\uu 32303。我想知道为什么我的命名空间需要实现该协议。那没有任何意义。然后我注意到$fn_32303。这告诉我在某个地方有一个lambda错误!

在这一点上,我的假设是我的模式有问题。因此,我从我的模式中删除了所有特殊验证,并在所有地方使用s/Str来查看它是否有效。是的,所以我在正确的位置!我添加了特殊的验证,一次一个,直到测试再次失败。问题出在我的约会模式中。

我查看了上面定义的模式,看看有什么不同。在那里,我注意到我没有将lambda包装在s/pred中。

道德

Clojure设计得很好,所以错误消息会准确地告诉您哪里出了问题。你只需要理解它。

 类似资料:
  • 详细内容请看这里

  • Hprose(High Performance Remote Object Service Engine) 是一款先进的轻量级、跨语言、跨平台、无侵入式、高性能动态远程对象调用引擎库。它不仅简单易用,而且功能强大。 你无需专门学习,只需看上几眼,就能用它轻松构建分布式应用系统。

  • 问题内容: 我想知道是否有可能实现这样的目标。 我有一个这样的游乐场: 我可以在中提供默认实现,但是如果需要默认实现中的所有内容以及其他内容,该怎么办? 它在某种程度上类似于es中的调用方法,可以满足实现每个属性等的要求。但是我看不到用实现相同的可能性。 问题答案: 我不知道您是否还在寻找答案,但是要做的方法是从协议定义中删除函数,将对象转换为对象,然后在其上调用方法: 由于某种原因,它仅在函数未

  • 我有两个感兴趣的文件:build。靴子 和src/clj/vidiot/server。clj 然后我,, 然后在我的浏览器中转到localhost:9090,终端打印。 我可以通过降级来解决这个问题:构建中的依赖项。引导至。 所以,我的问题是,为什么我不能在构建uberjar时使用(本文中的最新版本)?

  • 当我制作一个复合特征(名称?)这是由另外两个特性组成的,编译器似乎没有检测到这两个特性是由该复合特性实现的。 代码如下: 错误是这样的: 为什么它没有检测到特性没有同时实现和? (我省略了另一个同样以同样方式抱怨< code>Seek的错误消息。)

  • 我对Clojure很陌生,玩得很开心。有一件事我遇到了一些麻烦,那就是如何阅读错误,我个人认为它们不是很具有描述性,但这可能是由于我的“新手”。 例如,我现在遇到的问题是当我尝试启动我的环形服务器时(如果需要,我可以提供更多详细信息): 这对我来说太模糊了,我怎么知道我做错了什么?我不记得和任何“制造阅读器”、协议或IOFactory打过交道。