gpt4 book ai didi

java - 在 Clojure 中扩展 Dropwizard Service 类

转载 作者:行者123 更新时间:2023-12-02 06:20:05 25 4
gpt4 key购买 nike

我已经使用 Dropwizard 在 Scala 中编写 RESTful API 一段时间了,我真的很想在 Clojure 中使用它。

我想要做的是创建 com.yammer.dropwizard.Service 的子类,我可以在我的 -main 中实例化并运行它,我是努力实现这一目标。

据我所知,我的选择是:

    ns 声明中的
  1. gen-class。不可行,因为我想构建宏(例如 defservice),但我无法在 ns 声明中使用它。除非有某种方法可以在运行时生成一个东西并将其传递给compile,但这看起来像是一个肮脏的黑客。
  2. gen-classns 之外。尽管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 中,我得到了相同的异常。

  3. 代理。这似乎是最有前途的,它适用于简单的情况,但在扩展 Dropwizard 的 Service 类时则不然:

    user> (proxy [Object] [])
    #<Object$0 user.proxy$java.lang.Object$0@249faafc>
    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 忽略。所以也许我对为什么会发生这种情况的理解是错误的。

  4. deftype。不起作用,因为 Service 是一个类,而 deftype 仅适用于接口(interface)和协议(protocol)。

我认为我走在正确的轨道上,但缺少一些关于gen-class和/或proxy工作方式的微妙之处,并且Clojure文档是极其简洁。如何在 Clojure 中扩展这个 Java 类?

最佳答案

我会说使用选项 1,但除非我误解了您的描述,否则听起来您正在尝试在命名空间表单内编写代码?这不是你想要的。当您将 gen-class 添加到 namespace 表单时,将为整个 namespace 生成一个 Java 类。然后,您可以通过使用 - 前缀命名该 ns 中的函数来覆盖方法(或选择另一个并使用 :method-prefix)。

这是一个例子。我对您用来测试这些类的库了解不够,但它至少应该相似:

(ns com.myapp.MyService
(:gen-class
:extends com.yammer.dropwizard.Service
:exposes-methods {someSuperClassMethod someLocalAlias}))

;; now just write your code as normal, note that
;; you can access super-class methods with the exposes-methods
;; map above!

;; prefix your overriden methods with -

(defn -overriddenMethod
[params]
... )

希望有帮助!

关于java - 在 Clojure 中扩展 Dropwizard Service 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9025882/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com