У меня проблемы с добавлением зависимостей в мой 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>