私はDropwizardを使用してScalaのRESTful APIをしばらく書いていましたが、Clojureで実際に使用したいと思います。ClojureのDropwizardサービスクラスの拡張
com.yammer.dropwizard.Service
のサブクラスを作成して、-main
でインスタンス化して実行することができます。これを実現するために苦労しています。
は、これまでのところ、私が知っているように、私のオプションは以下のとおりです。
gen-class
ns
宣言で。ns
宣言では使用できないマクロ(defservice
など)を作成したいので、実現不可能です。実行時に何かを生成してcompile
に渡す方法がない限り、それは不潔なハックのようです。gen-class
外側ns
。 some 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
に入れ、同じ例外があります。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によって無視されたことを示すようです。だからおそらく私はなぜこれが起こっているのかについて間違っている。deftype
。Service
はクラスであり、deftype
はインターフェイスとプロトコルでのみ機能するため動作しません。
私は正しい軌道に乗ってだと思うが、どのようにgen-class
および/またはproxy
仕事の機微の一部が欠けていて、Clojureのドキュメントは非常に簡潔です。 ClojureでこのJavaクラスを拡張するにはどうすればよいですか?
Clojureは通常、ジェネリックパラメータを取るオブジェクトをプロキシすることができます(試して '(proxy [java.util.ArrayList] [])')。あなたの現在の問題は、 'com.yammer.dropwizard.AbstractService'の実装とコンストラクタ内の' getConfigurationClass'への呼び出しが原因です。 クイックルックに基づいて、Dropwizardのクラス階層は非常に奇妙に見えます。 – ponzao