0

同じJettyサーバーから静的ファイルとThriftサービスを提供しようとしています。今まで私は次のコードを持っています:

val server = new Server();
val connector = new SelectChannelConnector();
connector.setPort(4567);
server.addConnector(connector);

val servlet_handler = new ServletContextHandler(server,"/thrift",ServletContextHandler.SESSIONS);
servlet_handler.addServlet(new ServletHolder(new SomeThriftServlet()), "/thrift/*");

val resource_handler = new ResourceHandler();
resource_handler.setWelcomeFiles(new String[]{ "index.html" });
resource_handler.setResourceBase(".");

val handlers = new HandlerList();
handlers.setHandlers(new Handler[] { resource_handler, servlet_handler, new DefaultHandler() });
server.setHandler(handlers);

server.start();
server.join();

静的ファイルは問題なく提供されますが、Thriftサービスは404エラーを出し続けます。私は何が間違っているのですか?


:静的ファイルを提供するコードはこの質問から取得され、「val」タイプはプロジェクトlombokによって処理されますが、現在のコードの方が読みやすいと思うので、そのままにしておきました。

4

1 に答える 1

0

問題の核心は、を独自のコンテキストでラップしてからResourceHandler、2つ(またはそれ以上)のコンテキストに独自のベースパスを与える必要があることです。これは、ResourceHandlerに独自のベースパスがないためです。

この後、でサーバーにコンテキストを提供できますContextHandlerCollection。これにより、一致する最長のパスプレフィックスに基づいて使用するコンテキストが決定されます。

Server server = new Server();

val connector = new SelectChannelConnector();
connector.setPort(4567);
server.addConnector(connector);

val thr = new SomeThriftServlet();

val ct0 = new ServletContextHandler(ServletContextHandler.SESSIONS);
ct0.setContextPath("/thr");
ct0.addServlet(new ServletHolder(thr), "/*");

val rsc = new ResourceHandler();
rsc.setDirectoriesListed(true);
rsc.setWelcomeFiles(new String[]{ "index.html" });
rsc.setResourceBase(".");

val ct1 = new ContextHandler();
ct1.setContextPath("/rsc");
ct1.setHandler(rsc);

val contexts = new ContextHandlerCollection();
contexts.setHandlers(new Handler[] {ct0, ct1, new DefaultHandler() });

server.setHandler(contexts);

server.start();
server.join();
于 2012-06-07T14:00:42.633 に答える