3

しばらくの間、Dropwizard を使用して Scala で RESTful API を作成してきましたが、Clojure で使用したいと思っています。

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

私の知る限り、私のオプションは次のとおりです。

  1. gen-classns宣言中。宣言defserviceで使用できないマクロ ( など) を作成したいため、実行できません。ns実行時に何かを生成して に渡す方法がない限りcompile、それは不潔なハックのように思えます。
  2. 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が、同じ例外が発生しました。

  3. 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によって無視されたことを示しているようです。したがって、なぜこれが起こっているのかについて、おそらく私は間違っています。

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

私は正しい軌道に乗っていると思いますが、方法gen-classproxy動作の微妙な点がいくつか欠けており、Clojure のドキュメントは非常に簡潔です。Clojure でこの Java クラスを拡張するにはどうすればよいですか?

4

1 に答える 1

0

オプション1を使用すると思いますが、説明を誤解しない限り、名前空間フォーム内にコードを記述しようとしているように聞こえますか? これはあなたが望むものではありません。名前空間フォームに gen-class を追加すると、その名前空間全体に対して 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]
  ... )

それが役立つことを願っています!

于 2012-01-26T22:06:29.633 に答える