我将Clojure放入现有的Java项目中,该项目大量使用Jersey和Annotations。我希望能够利用以前工作中现有的自定义注释,过滤器等。到目前为止,我已经大致将deftype方法与Clojure Programming的第9章中的javax.ws.rs批注一起使用。

(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之外但在同一 namespace 内调用函数。至少在我看来,这使我可以将deftype集中在互操作性和连接Jersey方面,并且将应用程序逻辑分离(并且更像是我要编写的Clojure)。

但是,当我这样做时,会出现以下异常:
java.lang.IllegalStateException: Attempting to call unbound fn: #'my.namespace.TestResource/get-response

deftype和 namespace 有什么独特之处吗?

最佳答案

...有趣的是,我在这个问题上的时间直到我问了这里才给出答案:)

好像在this post.中解决了 namespace 加载和deftypes的问题,因为我怀疑deftype不会自动加载 namespace 。正如帖子中所发现的,我能够通过添加如下需求来解决此问题:

(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)))

10-06 16:05