Функция вызова Clojure deftype в том же пространстве имен выдает «java.lang.IllegalStateException: Попытка вызвать несвязанную fn:»

Я помещаю 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 и пространствах имен?

7
задан bdaniels 8 June 2012 в 17:46
поделиться