2012-06-08 5 views
7

Ich lege Clojure in ein bestehendes Java-Projekt, das Jersey und Anmerkungen stark verwendet. Ich möchte die vorhandenen benutzerdefinierten Anmerkungen, Filter usw. der vorherigen Arbeit nutzen können. Bisher habe ich den DefType-Ansatz mit javax.ws.rs-Annotationen in Kapitel 9 von Clojure Programming grob verwendet.Clojure deftype aufrufende Funktion im selben Namespace wirft "java.lang.IllegalStateException: Versuch, ungebundene Fn aufzurufen:"

(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))) 

Wie Sie aus den Kommentaren sehen können, möchte ich Funktionen außerhalb des deftype, aber innerhalb des gleichen Namespace aufrufen. Zumindest in meinen Gedanken, dies erlaubt mir, den Deftype auf Interop und Verkabelung bis Jersey zu konzentrieren, und die Anwendungslogik getrennt zu sein (und mehr wie die Clojure, die ich schreiben möchte).

Jedoch, wenn ich dies tun, erhalte ich die folgende Ausnahme:

java.lang.IllegalStateException: Attempting to call unbound fn: #'my.namespace.TestResource/get-response 

Gibt es etwas Einmaliges über ein Deftype und Namespaces?

Antwort

7

... lustig meine Stunden auf dieses Problem brachte keine Antwort, bis, nachdem ich hier gefragt :)

Es ist wie Laden und deftypes Namespace sieht in this post. angesprochen wurde Als ich die Deftype Verdacht laden nicht automatisch die Namensraum. Wie in der Post gefunden, war ich in der Lage, dies zu beheben, indem Sie eine Anforderung wie folgt hinzufügen: