我一直在使用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