7

ジャージーと注釈を多用する既存の Java プロジェクトに Clojure を配置しています。前作の既存のカスタムアノテーションやフィルターなどを活用できるようにしたいです。これまでのところ、 Clojure Programmingの第 9 章にある javax.ws.rs アノテーションを使用した deftype アプローチを大まかに使用してきました。

(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 と名前空間に固有のものはありますか?

4

1 に答える 1

7

...面白いことに、この問題に関する私の時間は、ここで質問するまで答えが得られませんでした:)

名前空間の読み込みと deftypes は、この投稿で対処されたようです。 私が疑ったように、deftype は名前空間を自動的にロードしません。投稿にあるように、次のようなrequireを追加することでこれを修正できました。

(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)))
于 2012-06-08T18:09:34.963 に答える