我将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

07-26 07:12