ジャージーと注釈を多用する既存の Java プロジェクトに Clojure を配置しています。前作の既存のカスタムアノテーションやフィルターなどを活用できるようにしたいです。これまでのところ、 Clojure Programmingの第 9 章にある javax.ws.rs アノテーションを使用した deftype アプローチを大まかに使用してきました。
(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 と名前空間に固有のものはありますか?