首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有需要枚举参数注释的clojure gen-class

带有需要枚举参数注释的clojure gen-class
EN

Stack Overflow用户
提问于 2019-12-11 16:18:03
回答 1查看 120关注 0票数 0

我想编写一个clojure库并公开生成的类,以便其他java项目可以使用它。我阅读并遵循了gen-class文档,除了带有枚举参数的类注释之外,一切都按照我的预期工作。

代码语言:javascript
复制
(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然后Response401。但是spring框架抛出异常,抱怨java.lang.EnumConstantNotPresentException: org.springframework.http.HttpStatus

我看了一下生成的类,它是这样的:

代码语言:javascript
复制
@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编译器就有这个bug?

P.S.尝试使用Clojure 1.9、1.10、1.10.1

EN

回答 1

Stack Overflow用户

发布于 2019-12-30 14:00:32

最后,我改用原生Java代码。我意识到用clojure编写类时只将ctor转发给超类会给自己带来麻烦。我在项目中嵌入了java代码,并在defproject中配置了:java-source-paths,解决了我的问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59281414

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档