如何在Kotlin中配置注入了其他依赖项的资源来配置JAX-RS应用程序

问题描述 投票:0回答:1

我使用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个回答
0
投票

[如果使用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)
    }
}

此外,为了可用于CDI,所有资源及其所有方法都必须为open(不是最终值)。>>

© www.soinside.com 2019 - 2024. All rights reserved.