Clojure的DEFTYPE在同一个命名空间中调用函数抛出“java.lang.IllegalSt

2019-09-17 22:14发布

我把Clojure的进入一个大量使用新泽西州和注解现有的Java项目。 我希望能够利用现有的定制标注,过滤器等的前期工作。 到目前为止,我已经大致使用在第9章发现javax.ws.rs注解DEFTYPE方法的Clojure编程 。

(ns my.namespace.TestResource
  (:use [clojure.data.json :only (json-str)])
  (:import [javax.ws.rs DefaultValue QueryParam Path Produces GET]
           [javax.ws.rs.core Response]))

;;My function that I'd like to call from the resource.
(defn get-response [to]
  (.build
    (Response/ok
      (json-str {:hello to}))))

(definterface Test
  (getTest [^String to]))

(deftype ^{Path "/test"} TestResource [] Test
  (^{GET true
     Produces ["application/json"]}
  getTest
  [this ^{DefaultValue "" QueryParam "to"} to]
  ;Drop out of "interop" code as soon as possible
  (get-response to)))

你可以从注释中看到,我想打电话给DEFTYPE之外的功能,但相同的命名空间内。 至少在我的脑海里,这使我有DEFTYPE专注于互操作和接线,泽西岛,并且应用程序逻辑是不同的(更喜欢的Clojure我想写)。

我这样做然而,当我得到以下异常:

java.lang.IllegalStateException: Attempting to call unbound fn: #'my.namespace.TestResource/get-response

有什么关于DEFTYPE和命名空间独特之处?

Answer 1:

......有趣的我对这个问题的时间没有取得一个答案,直到后,我在这里问:)

它看起来像命名空间加载和deftypes在解决了这个帖子。 正如我怀疑DEFTYPE不会自动加载的命名空间。 由于在后发现,我能够通过添加一个需要这样来解决这个问题:

(deftype ^{Path "/test"} TestResource [] Test
  (^{GET true
     Produces ["application/json"]}
    getTest
    [this ^{DefaultValue "" QueryParam "to"} to]
    ;Drop out of "interop" code as soon as possible
    (require 'my.namespace.TestResource) 
    (get-response to)))


文章来源: Clojure deftype calling function in the same namespace throws “java.lang.IllegalStateException: Attempting to call unbound fn:”