2017-06-27 5 views
1

私は単純なundertowサーブレットサーバーを作成しようとしていますが、私はサーブレットをインスタンス化したいと思っています。私はHttpServletを必ずしも使用する必要はありません。HttpServletRequestHttpServletResponseにアクセスする必要がありますので、myServicerで実行できます。これを達成する最良の方法は何ですか? 私の現在のコード:サーブレット/ Undertow - HttpServletRequestと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() 

引き波はちょうどそれがインスタンス化しようとするクラスを、望んでいるので、これは動作しません。ここ

全コード/プロジェクト:https://github.com/tipsy/javalin/pull/25/files

答えて

1

私が得た解決策は、あなたがサービサーを渡す「スタブ」サーブレットを作成することです。

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

0

私はアンダートウに精通したが、そのドキュメントをざっと見ではないですが、それは、アプリケーション・サーバー(およびウェブ)は、あなたが一緒にサーブレットとアンダートウハンドラを混在させることができると述べています。これは、HttpServletRequestまたはHttpServletResponseを使用するために、HttpServerExchangeでHandlerを使用するか、サーブレットを定義する必要があることを意味します。

+0

を私は本当にかかわらず、実際のサーブレットクラスを作成することを避けるためにしたいです。 – tipsy

関連する問題