clojure:没有为类找到协议方法的实现

重复8

我有一个环形服务器。我正在使用 Buddy 进行身份验证/授权。我通过实现-parse,-authenticate-handle-unauthorizedbuddy 协议IAuthenticationIAuthorization. 这里是:

(ns myproject.auth
  (:require [buddy.auth.protocols :as proto]))

...

(defn my-token-backend
  ([] (my-token-backend nil))
  ([{:keys [unauthorized-handler]}]
   (reify
     proto/IAuthentication
     (-parse [_ request]
       (token-or-nil))
     (-authenticate [_ request token]
       (get-user-from-token token))
     proto/IAuthorization
     (-handle-unauthorized [_ request metadata]
       (if unauthorized-handler
         (unauthorized-handler request metadata)
         (handle-unauthorized-default request))))))

wrap-authentication然后我在和wrap-authorization中间件中使用我的后端:

(defn middleware [handler]
  (-> handler
      (wrap-authentication my-token-backend)
      (wrap-authorization my-token-backend)

...并使用该中间件调用我的应用程序,如下所示(def app (middleware main-routes))

当我在浏览器中转到我的索引页面时,我收到以下错误:java.lang.IllegalArgumentException: No implementation of method: :-parse of protocol: #'buddy.auth.protocols/IAuthentication found for class: myproject.auth$my_token_backend.

当我调用(reflect my-token-backend)REPL 时,我注意到方法名称中的破折号-parse, -authenticate, 并-handle-unauthorized已转换为下划线。这是我收到该错误的原因,还是来自其他地方的错误?


编辑:在 Sean 发表评论后,我将中间件更改为如下所示:

(defn middleware [handler]
  (-> handler
      (wrap-authentication (my-token-backend))
      (wrap-authorization (my-token-backend))))
肖恩·科菲尔德

该类myproject.auth$my_token_backend是函数my-token-backend,您得到的错误表明调用-parse期望一个实现协议的对象——这将是调用函数结果。

所以我想你想要:

(defn middleware [handler]
  (-> handler
      (wrap-authentication (my-token-backend))
      (wrap-authorization (my-token-backend)))

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

没有为“功能”类定义“监听”方法吗?

没有为类型类定义方法

如果类没有为该方法提供实现,为什么类对象可以调用toString方法?

没有为String解析方法

为什么会出现错误“没有为Option类型找到名为collect的方法”?

Rust:没有为 struct `std::string::String` 找到名为 `join` 的方法

没有为Option <&std :: ffi :: OsStr>类型找到名为to_str的方法?

没有为 POST 找到路由......:方法不允许(允许:PUT)

没有为 URL 找到任何参数的反向

没有为String类型实现From <&String>特性

没有为[....]实现Ecto.Queryable

没有为`Event`实现`paint_evm :: Event`

没有为Foo实现core :: marker :: Sized

没有为Fn类型实现大小调整

没有为`&str`实现特质`Borrow <String>

为什么没有为队列实现len()?

Rocket 的 Responder 特性没有为 Result 实现

没有为以下模块提供实现:Str

没有为类“ Stream <T>”(rx-dart)定义方法“ retype”

无法在已实现的方法中序列化结构,因为“没有为 `Self` 实现特性 `serde::Serialize`”

java.io.NotSerializableException:->没有为类java.sql.Timestamp找到反序列化的构造函数

没有为org.hibernate.proxy.pojo.javassist.Javassist类找到序列化程序?

收到错误没有为类RCTRawText定义ViewManager

为什么我得到带有矢量的“没有为Option类型找到名为push的方法”?

Clojure多方法/协议实现

如何在SystemTime中访问as_secs?“没有为枚举结果找到名为`as_secs`的方法”

java: 没有为 addAll(java.util.List<java.lang.String>) 找到合适的方法

在当前范围内没有为结构 `HashMap` 找到名为 `match_command` 的方法

I / O问题没有为类org.json.JSONObject找到序列化程序,也没有发现创建BeanSerializer的属性