我一直在使用Dropwizard在Scala中編寫RESTful API一段時間,我真的很想在Clojure中使用它。在Clojure中擴展Dropwizard服務類
我想要做的是創建一個com.yammer.dropwizard.Service
的子類,我可以實例化並在我的-main
中運行,並且我正在努力做到這一點。
所以,據我所知,我的選擇是:
gen-class
在ns
聲明。不可行,因爲我想構建宏,例如defservice
,在ns
聲明中我不能使用這些宏。除非有什麼方法可以在運行時生成一個東西並將它傳遞給compile
,但這看起來像是一個骯髒的黑客。gen-class
outsidens
。儘管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
。這似乎是最有前途的,它適用於簡單的情況,但不延長Dropwizard的Service
上課的時候: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
服用一種類型的參數,但我無法找到任何信息關於在Clojure中處理這個問題。我發現的東西似乎表明這些只對javac有意義,並且被Clojure忽略。所以也許我不明白爲什麼會發生這種情況。deftype
。不起作用,因爲Service
是一個類,deftype
只適用於接口和協議。
我覺得我在正確的軌道上,但我缺少一些的gen-class
和/或proxy
工作,Clojure的文檔怎麼是非常簡潔的微妙之處。我如何在Clojure中擴展這個Java類?
Clojure通常可以代理一個需要通用參數的對象(嘗試'(proxy [java.util.ArrayList] [])')。你目前的問題是由於'com.yammer.dropwizard.AbstractService'的實現,特別是在構造函數中對'getConfigurationClass'的調用。 基於快速查看,Dropwizard的類層次結構看起來很奇怪。 – ponzao