我想编写一个clojure lib并公开生成的类,以便其他Java项目可以使用它。
我阅读并遵循了gen-class doc,除了带有enum参数的类注释之外,其他所有东西都按我的预期工作。

(ns common.exception.unauthorized
  (:gen-class :name
    ^{org.springframework.web.bind.annotation.ResponseStatus
      org.springframework.http.HttpStatus/UNAUTHORIZED}  ; <- here
              com.lalala.common.exception.Unauthorized
              :extends java.lang.RuntimeException
              :init init
              :constructors {[String] [String]}
              :main false
              :prefix "unauthorized-"))

(defn unauthorized-init [^String message]
  [[message] nil])



生成此异常类没有任何错误,它也可以用作Exception。但是,该异常旨在与spring web一起用作http响应。 Spring框架读取了注释,并发现它是HttpStatus/UNAUTHORIZED然后是响应401。但是Spring框架抛出异常并抱怨说java.lang.EnumConstantNotPresentException: org.springframework.http.HttpStatus

我看了一下生成的类,就像这样:

@ResponseStatus(HttpStatus.401)
public class Unauthorized extends RuntimeException {
    private static final Var init__var = Var.internPrivate("common.exception.unauthorized", "unauthorized-init");
    private static final Var getStackTrace__var = Var.internPrivate("common.exception.unauthorized", "unauthorized-getStackTrace");
    // ...... ellipsis
}


如图所示,HttpStatus/UNAUTHORIZED被编译为HttpStatus.401,这是无效的。

我也尝试使用{:code org.springframework.http.HttpStatus/UNAUTHORIZED}{:value org.springframework.http.HttpStatus/UNAUTHORIZED},它可以编译成@ResponseStatus(code/value = HttpStatus.401),但是枚举值本身仍然是无效形式HttpStatus.401

我是否以错误的方式对gen-class使用类注释?还是只是Clojure编译器有这个错误?

附言用Clojure 1.9、1.10、1.10.1尝试过

最佳答案

最后,我改用本机Java代码。我意识到用clojure编写类,而仅将ctor转发给超类,这给我自己造成了麻烦。
我将Java代码与在:java-source-paths中配置的defproject一起嵌入到项目中,解决了我的问题。

10-05 18:36