Использование внедрения зависимостей Guice в HttpServlet с Kotlin - PullRequest
0 голосов
/ 21 сентября 2018

У меня проблемы с добавлением зависимостей в мой HttpServlet.Если я использую инъекцию конструктора, я получаю ошибку создания сервлета из-за отсутствия пустого конструктора (даже когда я использую плагин kotlin-noarg).Если я использую @Inject на lateinit var, я получаю lateinit property name has not been initialized ошибку.Что я делаю не так?

Вот мой код:

HomeController.kt

import com.google.inject.Inject
import com.google.inject.Singleton
import com.google.inject.name.Named
import javax.servlet.annotation.WebServlet
import javax.servlet.http.HttpServlet
import javax.servlet.http.HttpServletRequest
import javax.servlet.http.HttpServletResponse

@Singleton
@WebServlet(name = "Hello", value = ["/hello"])
class HomeController: HttpServlet() {

    @Inject
    @Named("app-url")
    lateinit var name: String

    override fun doGet(req: HttpServletRequest, res: HttpServletResponse) {
        res.writer.write("Hello, $name!")
    }
}

MainModule.kt

class MainModule : Module {

    /**
     * Contributes bindings and other configurations for this module to `binder`.
     */
    override fun configure(binder: Binder) {
        val conf = ConfigFactory.load()

        binder.bind(String::class.java).annotatedWith(Names.named("app-url")).toInstance(conf.getString("appUrl")) // TODO: move to env

    }
}

MyGuiceServletConfig.kt

import com.google.inject.Guice
import com.google.inject.Injector
import com.google.inject.servlet.GuiceServletContextListener

class MyGuiceServletConfig : GuiceServletContextListener() {
    override fun getInjector(): Injector {
        return Guice.createInjector(
                MyServletModule(),
                MainModule()
        )
    }
}

MyServletModule.kt

class MyServletModule: ServletModule() {

    override fun configureServlets() {
        serve("/home").with(HomeController::class.java)
    }
}

webapp / WEB-INF / web.xml

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         version="3.0">
    <filter>
        <filter-name>guiceFilter</filter-name>
        <filter-class>com.google.inject.servlet.GuiceFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>guiceFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <listener>
        <listener-class>tj.alif.core.app.guice.MyGuiceServletConfig</listener-class>
    </listener>
</web-app>

1 Ответ

0 голосов
/ 21 сентября 2018

Вы уже пробовали это?

@JvmField
@Inject
@Named("app-url")
lateinit var name: String

К сожалению, это всего лишь предположение, поскольку у меня сейчас нет IDE.

...