2012-06-08 10 views
7

Sto posizionando Clojure in un progetto Java esistente che utilizza pesantemente Jersey e Annotations. Mi piacerebbe essere in grado di sfruttare le annotazioni personalizzate esistenti, i filtri, ecc. Del lavoro precedente. Finora ho usato approssimativamente l'approccio deftype con le annotazioni javax.ws.rs trovate nel capitolo 9 di Clojure Programming.Clojure deftype chiama la funzione nello stesso spazio dei nomi genera "java.lang.IllegalStateException: Tentativo di chiamare unbound fn:"

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

Come si può vedere dai commenti, mi piacerebbe chiamare le funzioni al di fuori del deftype, ma all'interno dello stesso spazio dei nomi. Almeno nella mia mente, questo mi permette di avere il deftype focalizzato su interoperabilità e cablaggio fino a Jersey, e la logica dell'applicazione deve essere separata (e più simile al Clojure che voglio scrivere).

Tuttavia quando faccio questo ottengo la seguente eccezione:

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

C'è qualcosa di unico su un DEFTYPE e spazi dei nomi?

risposta

7

... divertenti mie ore su questo problema non ha dato una risposta solo dopo ho chiesto qui :)

Sembra namespace carico e deftypes è stata affrontata in this post. Come sospettavo la DEFTYPE non carica automaticamente il namespace. Come trovato nel post, sono stato in grado di risolvere questo problema aggiungendo un fabbisogno simile al seguente:

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