しばらくの間、Dropwizard を使用して Scala で RESTful API を作成してきましたが、Clojure で使用したいと思っています。
私がやろうとしているのはcom.yammer.dropwizard.Service、インスタンス化して実行できるのサブクラスを作成する-mainことです。これを実現するのに苦労しています。
私の知る限り、私のオプションは次のとおりです。
gen-classns宣言中。宣言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 クラスを拡張するにはどうすればよいですか?