我将Clojure放入现有的Java项目中,该项目大量使用Jersey和Annotations。我希望能够利用以前工作的现有自定义注释,过滤器等。到目前为止,我一直在大致使用defotype方法和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之外的函数,但是在同一个命名空间内。至少在我看来,这让我可以将deftype专注于interop并连接到Jersey,并将应用程序逻辑分开(更像是我想写的Clojure)。
但是,当我这样做时,我得到以下异常:
java.lang.IllegalStateException: Attempting to call unbound fn: #'my.namespace.TestResource/get-response
deftype和名称空间有什么独特之处吗?
答案 0 :(得分:7)
...好笑我在这个问题上的时间直到我问到这个问题后才得到答案:)
在this post.中解决了命名空间加载和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)))