我将Swagger注释添加到JaxRs注释服务。
我有以下几点:
(^{
GET true
Path "/{who}"
ApiOperation {:value "Get a hello" :notes "simple clojure GET"}
Produces ["text/plain; charset=UTF-8"]
ApiResponses {:value [(ApiResponse {:code 200 :message "yay!"})]}
}
如果我反编译产生的类,则注释如下所示:
@ApiResponses({@com.wordnik.swagger.annotations.ApiResponse(code=200L, message="yay!")})
@Produces({"text/plain; charset=UTF-8"})
@ApiOperation(value="Get a hello", notes="simple clojure GET")
@Path("/{who}")
@GET(true)
注意在第一个注释代码中= 200L
在运行时,此值必须为int,我无法弄清楚如何实现
如果我尝试
ApiResponses {:value [(ApiResponse {:code (int 200) :message "yay!"})]}
我收到编译错误(使用Maven swagger插件)
Exception in thread "main" java.lang.ClassCastException: clojure.lang.Var cannot be cast to java.lang.Class, compiling:(pocclj/resourceclj.clj:14)
我努力了
(def success (int 200))
...
ApiResponses {:value [(ApiResponse {:code success :message "yay!"})]}
产生此编译错误:
Exception in thread "main" java.lang.IllegalArgumentException: Unsupported annotation value: success of class class java.lang.Integer, compiling:(pocclj/resourceclj.clj:14)
我尝试了一堆其他东西(deref等),但是找不到秘密的调味料。
我是新手,急于为此寻求帮助。
提前致谢
马丁
最佳答案
您正在正确设置':code'的类型。可以独立测试:
user> (def something ^{:ApiResponses {:code (int 200) :message "yay!"}} {:some :data :goes :here})
#'user/something
user> (meta something)
{:ApiResponses {:code 200, :message "yay!"}}
user> (-> (meta something) :ApiResponses :code type)
java.lang.Integer
在没有强制转换的情况下,元数据包含错误的类型:
user> (def something-wrong ^{:ApiResponses {:code 200 :message "yay!"}} {:some :data :goes :here})
#'user/something-wrong
user> (meta something)
{:ApiResponses {:code 200, :message "yay!"}}
user> (-> (meta something-wrong) :ApiResponses :code type)
java.lang.Long
从异常看来,对
ApiResponse
的调用似乎崩溃了。如果ApiResponse是一个期望数字而不是s表达式的宏,那么我可以看到它无法正确处理它。如果它是一个函数,则需要查看其崩溃的原因。如果我为ApiResponse提供了存根实现,那么它对我有用:
user> (definterface Fooi (Something []))
user.Fooi
user> (def ApiResponse identity)
#'user/ApiResponse
user> (deftype Foo []
Fooi
(Something
^{GET true
Path "/{who}"
ApiOperation {:value "Get a hello" :notes "simple clojure GET"}
Produces ["text/plain; charset=UTF-8"]
ApiResponses {:value [(ApiResponse {:code (int 200) :message "yay!"})]}}
[this] (identity this)))
user.Foo