2012-06-08 11 views
7

Estoy colocando Clojure en un proyecto Java existente que utiliza jersey y anotaciones. Me gustaría poder aprovechar las anotaciones personalizadas existentes, los filtros, etc. del trabajo anterior. Hasta ahora he estado usando groseramente el enfoque de deftype con las anotaciones javax.ws.rs que se encuentran en el Capítulo 9 de Clojure Programming.La función de llamada Clojure deftype en el mismo espacio de nombres arroja "java.lang.IllegalStateException: Intentando llamar a unfn no enlazado:"

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

Como se puede ver en los comentarios, me gustaría llamar a funciones fuera del DEFTYPE, pero dentro del mismo espacio de nombres. Al menos en mi mente, esto me permite tener el enfoque de deftype en la interoperabilidad y el cableado hasta Jersey, y la lógica de la aplicación en ser separada (y más como el Clojure que quiero escribir).

Sin embargo cuando hago esto me sale el siguiente excepción:

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

¿Hay algo único acerca de un DEFTYPE y espacios de nombres?

Respuesta

7

... divertidos mis horas en este problema no dió una respuesta hasta después pedí aquí :)

Parece que la carga y el espacio de nombres deftypes se abordó en this post. Como sospechaba la DEFTYPE no se carga automáticamente el espacio de nombres Como encontré en la publicación, pude solucionar esto agregando un requerimiento como este:

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