Я использовал Dropwizard для написания API RESTful в Scala некоторое время, и я действительно хотел бы использовать его в Clojure.Расширение класса обслуживания Dropwizard в Clojure
То, что я пытаюсь сделать, это создать подкласс com.yammer.dropwizard.Service
, который я могу создать и запустить в своем -main
, и я изо всех сил стараюсь, чтобы это произошло.
Насколько я знаю, мои варианты:
gen-class
ns
в декларации. Невозможно, потому что я хочу создавать макросы (например,defservice
), которые я не могу использовать в объявленииns
. Если есть какой-то способ генерировать вещь во время выполнения и передать ееcompile
, но это кажется грязным взломом.gen-class
наружныйns
. Несмотря на то, что 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. То, что я нашел, казалось, указывало, что они были только значимыми для джавака и игнорировались Клоджуре. Поэтому, возможно, я ошибаюсь в том, почему это происходит.deftype
. Не работает, потому чтоService
является классом, аdeftype
работает только с интерфейсами и протоколами.
Я думаю, что я нахожусь на правильном пути, но не хватает некоторых тонкостей, как gen-class
и/или proxy
работы и документация Clojure крайне лаконична. Как я могу расширить этот класс Java в Clojure?
Clojure обычно может проксировать объект, который принимает общие параметры (try '(proxy [java.util.ArrayList] [])'). Ваша текущая проблема связана с реализацией 'com.yammer.dropwizard.AbstractService' и особенно вызова' getConfigurationClass' внутри конструктора. На основе быстрого просмотра иерархия классов Dropwizard кажется очень странной. – ponzao