Я помещаю Clojure в существующий проект Java, в котором активно используются Jersey и Annotations. Я хотел бы иметь возможность использовать существующие пользовательские аннотации, фильтры и т. д. из предыдущей работы. До сих пор я примерно использовал подход deftype с аннотациями javax.ws.rs, найденными в главе 9 Программирование на 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 и пространствах имен?