2012-01-26 6 views
3

私はDropwizardを使用してScalaのRESTful APIをしばらく書いていましたが、Clojureで実際に使用したいと思います。ClojureのDropwizardサービスクラスの拡張

com.yammer.dropwizard.Serviceのサブクラスを作成して、-mainでインスタンス化して実行することができます。これを実現するために苦労しています。

は、これまでのところ、私が知っているように、私のオプションは以下のとおりです。

  1. gen-classns宣言で。 ns宣言では使用できないマクロ(defserviceなど)を作成したいので、実現不可能です。実行時に何かを生成してcompileに渡す方法がない限り、それは不潔なハックのようです。
  2. gen-class外側nssome code I foundにもかかわらず、これはまったく機能しないようです。ここでは簡単な例です:

    user> (gen-class :name foo :extends Object) 
    nil 
    user> (foo.) 
    Unable to resolve classname: foo 
    [Thrown class java.lang.IllegalArgumentException] 
    

    私はgen-classはコンパイル時にのみ動作することを認識しています。私はこれをファイルに入れて(foo.を私の-mainに入れ、同じ例外があります。

  3. proxy

    user> (proxy [Object] []) 
    #<Object$0 [email protected]> 
    user> (import [com.yammer.dropwizard Service]) 
    com.yammer.dropwizard.Service 
    user> (proxy [Service] ["x"]) 
    java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType 
        [Thrown class java.lang.ClassCastException] 
    

    私は、これは型パラメータを取るServiceが原因かもしれないと思うが、私はすべての情報を見つけることができませんでした:DropwizardのServiceクラスを拡張するとき、これが最も有望であると思われ、それが単純な場合のために動作しますが、ではありませんClojureでこれを扱うことについて。私が見つけたのは、これらがjavacにとってだけ意味があり、Clojureによって無視されたことを示すようです。だからおそらく私はなぜこれが起こっているのかについて間違っている。

  4. deftypeServiceはクラスであり、deftypeはインターフェイスとプロトコルでのみ機能するため動作しません。

私は正しい軌道に乗ってだと思うが、どのようにgen-classおよび/またはproxy仕事の機微の一部が欠けていて、Clojureのドキュメントは非常に簡潔です。 ClojureでこのJavaクラスを拡張するにはどうすればよいですか?

+0

Clojureは通常、ジェネリックパラメータを取るオブジェクトをプロキシすることができます(試して '(proxy [java.util.ArrayList] [])')。あなたの現在の問題は、 'com.yammer.dropwizard.AbstractService'の実装とコンストラクタ内の' getConfigurationClass'への呼び出しが原因です。 クイックルックに基づいて、Dropwizardのクラス階層は非常に奇妙に見えます。 – ponzao

答えて

0

私はあなたの説明を誤解しない限り、名前空間形式の中にコードを書こうとしているように聞こえますか?これはあなたが望むものではありません。名前空間形式にgenクラスを追加すると、その名前空間全体に対してJavaクラスが生成されます。次に、そのns内の関数に-prefix(または別のものを選択して:method-prefix)を指定してメソッドをオーバーライドすることができます。

例を示します。私はこれらのクラスでテストするために使用しているライブラリについては十分に分かりませんが、少なくとも類似している必要があります。

(ns com.myapp.MyService 
    (:gen-class 
    :extends com.yammer.dropwizard.Service 
    :exposes-methods {someSuperClassMethod someLocalAlias})) 

;; now just write your code as normal, note that 
;; you can access super-class methods with the exposes-methods 
;; map above! 

;; prefix your overriden methods with - 

(defn -overriddenMethod 
    [params] 
    ...) 

希望します。

+0

これの主な問題は、サービスの作成者が定型文を(ns ...)にドロップする必要があることです。私が望むのは、適切な 'gen-class'(または何でも)を生成する' defservice'を持つことです。私はこの方法は、それが働く唯一のものであれば受け入れられるだろうと思うが、それが私が望む方法からは遠い。 – ieure