我将 Clojure 放入一个大量使用 Jersey 和 Annotations 的现有 Java 项目中。我希望能够利用以前工作的现有自定义注释、过滤器等。到目前为止,我一直在大致使用带有 javax.ws.rs 注释的 deftype 方法,在Clojure 编程的第 9 章中可以找到。
(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 的重点放在互操作和连接到 Jersey 上,并且应用程序逻辑是独立的(更像是我想编写的 Clojure)。
但是,当我这样做时,会出现以下异常:
java.lang.IllegalStateException: Attempting to call unbound fn: #'my.namespace.TestResource/get-response
deftype 和命名空间有什么独特之处吗?