2017-06-27 1 views
1

J'essaie de créer un serveur de servlets simple, mais j'ai quelques problèmes avec le fait de vouloir instancier le servlet. Je n'ai pas nécessairement besoin d'utiliser HttpServlet, j'ai juste besoin d'accéder à HttpServletRequest et HttpServletResponse afin que je puisse les passer par myServicer. Quel est le meilleur moyen d'y parvenir? Mon code actuel:Servlets/Undertow - Accès à HttpServletRequest et HttpServletResponse

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() 

Cela ne fonctionne pas parce que veut juste une undertow classe, qu'il essaie d'instancier.

code complet/projet ici: https://github.com/tipsy/javalin/pull/25/files

Répondre

1

La solution que j'ai eu est de créer une servlet "stub" dans laquelle vous passez le serveur.

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() 

Le prestataire de service peut alors être chargé au cours de chaque phase d'initialisation du servlet:

private var javalinServlet: JavalinServlet? = null 

@Throws(ServletException::class) 
override fun init(config: ServletConfig) { 
    this.config = config 
    javalinServlet = config.servletContext.getAttribute("javalin-servlet") as JavalinServlet 
} 

Vous pouvez voir les changements ici: https://github.com/osmundf/javalin-undertow/commit/30487196f2dd7a44d3ef524f642040a7330caf4e

0

Je ne suis pas familier avec Undertow mais rapide coup d'oeil à leur documentation dit qu'il est un serveur d'applications (web aussi) et vous pouvez mélanger les gestionnaires Servlet et Undertow ensemble. Cela signifie très probablement que vous devez utiliser Handler avec HttpServerExchange ou définir une servlet pour utiliser HttpServletRequest ou HttpServletResponse.

+0

Je veux vraiment éviter d'avoir à créer une classe Servlet réelle bien . – tipsy