Servlets/Undertow - Доступ к HttpServletRequest и HttpServletResponse
Я пытаюсь создать простой сервлет-сервер undertow, но у меня есть некоторые проблемы с желанием создать сервлет. Мне не обязательно использовать HttpServlet
Мне просто нужен доступ к HttpServletRequest
а также HttpServletResponse
чтобы я мог их прогнать myServicer
, Какой лучший способ достичь этого? Мой текущий код:
myServicer = ...
undertow = Undertow.builder()
.addHttpListener(port, host)
.setHandler(Handlers.path(Handlers.redirect("/")).addPrefixPath("/",
Servlets.defaultContainer().addDeployment(
Servlets.deployment()
.setClassLoader(EmbeddedUndertowServer::class.java.classLoader)
.setDeploymentName("myDeployment").setContextPath("/")
.addServlets(Servlets.servlet("myServlet",
object : HttpServlet() {
override fun service(request: HttpServletRequest, response: HttpServletResponse) {
myServicer.service(request, response) // doesn't work
}
}.javaClass).addMapping("/"))
).apply { deploy() }.start()
))
.build()
undertow.start()
Это не работает, потому что undertow просто хочет класс, который он пытается создать.
Полный код / проект здесь: https://github.com/tipsy/javalin/pull/25/files
2 ответа
Решение, которое я получил, состоит в том, чтобы создать сервлет-заглушку, в который вы передаете обслуживающий сервер.
val servletBuilder = Servlets.deployment()
.setClassLoader(EmbeddedUndertowServer::class.java.getClassLoader())
.setContextPath("/")
.setDeploymentName("javalinDeployment")
.addServletContextAttribute("javalin-servlet", javalinServlet)
.addServlets(Servlets.servlet("javalinServlet", UndertowServlet::class.java).addMapping("/"))
val manager = Servlets.defaultContainer().addDeployment(servletBuilder)
manager.deploy()
val httpHandler = manager.start()
val path = Handlers.path(Handlers.redirect("/")).addPrefixPath("/", httpHandler)
this.undertow = Undertow.builder().addHttpListener(port, host).setHandler(path).build()
undertow.start()
Затем сервисер может быть загружен во время каждой фазы инициализации сервлета:
private var javalinServlet: JavalinServlet? = null
@Throws(ServletException::class)
override fun init(config: ServletConfig) {
this.config = config
javalinServlet = config.servletContext.getAttribute("javalin-servlet") as JavalinServlet
}
Вы можете просмотреть изменения здесь: https://github.com/osmundf/javalin-undertow/commit/30487196f2dd7a44d3ef524f642040a7330caf4e
Я не знаком с Undertow, но при быстром взгляде на их документацию сказано, что это сервер приложений (в том числе и веб), и вы можете смешивать обработчики Servlet и Undertow вместе. Скорее всего, это означает, что вам нужно либо использовать Handler с HttpServerExchange
или определите сервлет для использования HttpServletRequest или HttpServletResponse.