我使用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达到相同的目的?
[如果使用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
(不是最终值)。>>