しばらくの間、Dropwizard を使用して Scala で RESTful API を作成してきましたが、Clojure で使用したいと思っています。
私がやろうとしているのはcom.yammer.dropwizard.Service
、インスタンス化して実行できるのサブクラスを作成する-main
ことです。これを実現するのに苦労しています。
私の知る限り、私のオプションは次のとおりです。
gen-class
ns
宣言中。宣言defservice
で使用できないマクロ ( など) を作成したいため、実行できません。ns
実行時に何かを生成して に渡す方法がない限りcompile
、それは不潔なハックのように思えます。gen-class
外側ns
。私が見つけたいくつかのコードにもかかわらず、これはまったく機能しないようです。簡単な例を次に示します。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
. これは最も有望なようで、単純なケースでは機能しますが、Dropwizard のService
クラスを拡張する場合には機能しません。user> (proxy [Object] []) #<Object$0 user.proxy$java.lang.Object$0@249faafc> 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
が、Clojure でこれを処理する方法についての情報は見つかりませんでした。私が見つけたのは、これらがjavacにとってのみ意味があり、Clojureによって無視されたことを示しているようです。したがって、なぜこれが起こっているのかについて、おそらく私は間違っています。deftype
.Service
はクラスであるため機能せずdeftype
、インターフェイスとプロトコルでのみ機能します。
私は正しい軌道に乗っていると思いますが、方法gen-class
やproxy
動作の微妙な点がいくつか欠けており、Clojure のドキュメントは非常に簡潔です。Clojure でこの Java クラスを拡張するにはどうすればよいですか?