【问题标题】:Using imported Java libs in Clojure REPL在 Clojure REPL 中使用导入的 Java 库
【发布时间】:2020-03-04 22:44:56
【问题描述】:

Twilio docs for Java lib

MVN for this lib

我正在尝试使用 Clojure 的 Twilio。 Clojure 开发人员很新,所以我一般都在尝试掌握导入库。

我的project.clj 看起来像这样:

(defproject magical-new-project "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :url "http://example.com/FIXME"
  :license {:name "EPL-2.0 OR GPL-2.0-or-later WITH Classpath-exception-2.0"
            :url "https://www.eclipse.org/legal/epl-2.0/"}
  :dependencies [[org.clojure/clojure "1.10.0"]
                 [com.twilio.sdk/twilio "7.47.5"]]
  :repl-options {:init-ns magical-new-project.core})

我认为我正确地导入了 Twilio Java 库,但我不确定。

我的core.clj 看起来像:

(ns magical-new-project.core
  (:import [com.twilio Twilio]
           ;[com.twilio.http Request Response]
           [com.twilio.rest.api.v2010.account Message]
           [com.twilio.rest.api.v2010.account Call]
           [com.twilio.type PhoneNumber]))

(defn foo
  "I don't do a whole lot."
  [x]
  (println x "Peacefully disengage, World!"))

据我所知,这应该是正确导入Twilio class shown here.

然后我尝试(从 REPL)初始化我希望已成功导入的 Twilio 对象,但它失败了。

$ lein repl
nREPL server started on port 62356 on host 127.0.0.1 - nrepl://127.0.0.1:62356
REPL-y 0.4.3, nREPL 0.6.0
Clojure 1.10.0
OpenJDK 64-Bit Server VM 12.0.1+12
    Docs: (doc function-name-here)
          (find-doc "part-of-name-here")
  Source: (source function-name-here)
 Javadoc: (javadoc java-object-or-class-here)
    Exit: Control+D or (exit) or (quit)
 Results: Stored in vars *1, *2, *3, an exception in *e

magical-new-project.core=> (Twilio. "My API or Account SID goes here" "My AUTH_TOKEN or API secret goes here")
Syntax error (IllegalArgumentException) compiling new at (form-init14687807219308370487.clj:1:1).
No matching ctor found for class com.twilio.Twilio

据我所知,No matching ctor 的意思是没有构造函数可以接受我提供的参数,但line 39 of the Twilio.java file 似乎需要两个字符串,然后如果你look here,你'会看到我正在发送正确的参数(ACCOUNT_SID 和 AUTH_TOKEN)。

目前,我不确定我是否 (1) 正确导入了 Twilio 类,(2) 正确地将依赖项添加到项目中,(2) 正确使用 REPL,或者 (4) 正确使用Twilio SDK。也许我做错了所有这些。

如果您能给我提供任何帮助或建议,我将不胜感激。

【问题讨论】:

  • 您链接到的函数不是构造函数,而是类上的静态函数。你称它为(Twilio/init "foo" "bar")。如果它实际上是构造函数,则您的语法是正确的。另外:令人惊讶的是,他们设计了他们的 java api,使其只能是静态单例。哇。
  • @bfabry:你,我的朋友,是个慷慨的天才。您似乎解决了我的问题,并帮助我在 Clojure 能力的道路上迈出了一步。
  • 非常感谢您的帮助。
  • 如果你正在建立一个新项目,你可能会发现克隆和修改这个 repo 很有帮助:github.com/io-tupelo/clj-template
  • 谢谢@AlanThompson。我已经为它添加了书签,并会尝试一下。

标签: clojure twilio twilio-api clojure-java-interop


【解决方案1】:

您链接到的函数不是构造函数,而是类上的静态函数。您可以在 clojure 中的类上调用静态函数,例如 (Twilio/init "foo" "bar")。如果它实际上是构造函数,则您的语法是正确的。

感谢@juraj。我不确定这是否真的可以作为答案:-)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-04
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 2011-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多