Я уже давно использую Dropwizard для написания RESTful API в Scala, и мне бы очень хотелось использовать его в 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
. Это кажется наиболее перспективным, и это работает для простых случаев, но не для расширения классаService
Dropwizard: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 чрезвычайно лаконична. Как я могу расширить этот класс Java в Clojure?
(proxy [java.util.ArrayList] [])
). Ваша текущая проблема связана с реализациейcom.yammer.dropwizard.AbstractService
и особенно с вызовомgetConfigurationClass
внутри конструктора. На первый взгляд иерархия классов Dropwizard кажется очень странной. - person ponzao   schedule 27.01.2012