【问题标题】:How can I configure a JAX-RS application in Kotlin with resources having other dependencies injected如何在 Kotlin 中配置具有注入其他依赖项的资源的 JAX-RS 应用程序
【发布时间】:2020-03-18 11:06:45
【问题描述】:

我使用 JAX-RS 构建 REST API。为了引导所有资源,我重写了一个“应用程序”:

import javax.enterprise.context.ApplicationScoped;
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

@ApplicationScoped
@ApplicationPath("/")
open class ApiConfig : Application() {
    override fun getSingletons(): MutableSet<Any> {
        println("----- init jaxrs -----")
        return mutableSetOf(EchoResource())
    }
}

如您所见,我用括号注册了EchoResource()。当我使用EchoResource::class时它不起作用。

我的问题是,我想向EchoResource 注入一些服务:

import dev.elysion.mail.smtp.MailService
import javax.enterprise.context.RequestScoped
import javax.inject.Inject
import javax.ws.rs.GET
import javax.ws.rs.Path

@Path("/echo")
@RequestScoped
class EchoResource @Inject constructor(private val mailService: MailService) {

    @GET
    fun getHello(): String {
        return "Hello World"
    }
}

当我添加构造函数时,我在 API Config 中收到一个错误,提示我没有为 MailService 传递参数。

在 Java 中,我会使用不关心任何参数的 EchoResource.class 注册资源。

如何使用 Kotlin 实现相同的目标?

【问题讨论】:

    标签: kotlin jax-rs cdi weld


    【解决方案1】:

    如果使用getClasses() 而不是getSingletons(),它会起作用:

    import javax.enterprise.context.ApplicationScoped
    import javax.ws.rs.ApplicationPath
    import javax.ws.rs.core.Application
    
    @ApplicationScoped
    @ApplicationPath("/")
    open class ApiConfig : Application() {
        override fun getClasses(): MutableSet<Class<*>> {
            return mutableSetOf(EchoResource::class.java)
        }
    }
    

    此外,所有资源及其所有方法都必须是 open(不是最终的),才能被 CDI 代理。

    【讨论】:

      猜你喜欢
      • 2017-03-28
      • 2016-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-20
      • 2019-11-23
      • 1970-01-01
      相关资源
      最近更新 更多