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.

Другие вопросы по тегам