Как я могу настроить приложение JAX-RS в Kotlin с использованием ресурсов с другими зависимостями? - PullRequest
0 голосов
/ 18 марта 2020

Я использую JAX-RS для создания REST API. Для bootstrap всех ресурсов у меня переопределено «Приложение»:

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?

1 Ответ

0 голосов
/ 18 марта 2020

Работает, если вместо getSingletons() используется getClasses():

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.

...