1

Jetty サーバーをセットアップする方法は次のとおりです。

Server server = new Server(80);
server.setStopAtShutdown(true);

ServletHandler servletHandler = new ServletHandler();
servletHandler.addServletWithMapping(Erreur500Servlet.class, "/generate-error-500");
servletHandler.addServletWithMapping(AresServlet.class, "/ares/*");
servletHandler.addFilterWithMapping(RequestLoggingFilter.class, "/*", EnumSet.of(DispatcherType.REQUEST));

server.setHandler(servletHandler);
server.start(); // at com.company.MyPoc.init(MyPoc.java:44)
server.join();

ただし、起動すると、次の例外が発生しました。

2015-10-20 12:53:07,565 (?:?) [WARN] FAILED com.company.filter.RequestLoggingFilter-896472140: java.lang.NullPointerException 
java.lang.NullPointerException: null
    at org.eclipse.jetty.servlet.FilterHolder.doStart(FilterHolder.java:100) ~[jetty-servlet-8.0.1.v20110908.jar:8.0.1.v20110908]
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:59) [jetty-util-8.0.1.v20110908.jar:8.0.1.v20110908]
    at org.eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.java:753) [jetty-servlet-8.0.1.v20110908.jar:8.0.1.v20110908]
    at org.eclipse.jetty.servlet.ServletHandler.doStart(ServletHandler.java:183) [jetty-servlet-8.0.1.v20110908.jar:8.0.1.v20110908]
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:59) [jetty-util-8.0.1.v20110908.jar:8.0.1.v20110908]
    at org.eclipse.jetty.server.handler.HandlerWrapper.doStart(HandlerWrapper.java:89) [jetty-server-8.0.1.v20110908.jar:8.0.1.v20110908]
    at org.eclipse.jetty.server.Server.doStart(Server.java:262) [jetty-server-8.0.1.v20110908.jar:8.0.1.v20110908]
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:59) [jetty-util-8.0.1.v20110908.jar:8.0.1.v20110908]
    at com.company.MyPoc.init(MyPoc.java:44) 

私は何が欠けていますか?

桟橋 8.0.1.v20110908

4

2 に答える 2

2

まず、最も重要なことは、Jetty 8 が EOL (End of Life) であることです。

次に、より新しいバージョンの Jetty を使用してください。Jetty 8.0.1 は、(現在) Jetty の現在の安定バージョンから約 110 リリース遅れています。

さて、何が起こっているのかを説明します。

ServletHandler を直接使用しています。これは、インスタンス化して直接アクセスすることを意図したものではなく、最も単純で素朴な状況下での内部クラスです。つまり、正確に 1 つ (そして 1 つだけ) のサーブレット、フィルターなし、セキュリティなし、セッション処理なしなどのサーバーです...

を使用してServletContextHandler、サーブレットとフィルターを追加します。ServletContextこれは、関連するすべてのサーブレットとフィルターが調整に使用する を確立するため、適切な方法です。

(Jetty 8.0.1 は非常に古いため、これはメモリから実行されます。古いバージョンの Jetty で適切に動作するには、微調整が必​​要になる場合があります) :

Server server = new Server(8080);
ServletContextHandler context = new ServletContextHandler();
context.setContextPath("/");
context.setResourceBase("/path/to/my/static/resources/");
context.setHandler(server);

context.addServlet(Erreur500Servlet.class, "/generate-error-500");
context.addServlet(AresServlet.class, "/ares/*");
context.addFilter(RequestLoggingFilter.class, "/*", EnumSet.of(DispatcherType.REQUEST));
context.addServlet(DefaultServlet.class, "/");

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

注:

  • 提供する静的リソース (html、javascript、css、画像など) がある場合は、ベース リソース パスを設定します.setResourceBase(String)(新しい、より優れ.setBaseResource(Resource)たものが Jetty 9 で追加されました)。
  • 静的リソースを提供したり、エラー処理を取得したい場合は、呼び出すことを忘れないでくださいcontext.addServlet(DefaultServlet.class, "/")

カスタム エラー処理が必要な場合は、次のような ServletContextHandler ErrorHandler 機能を使用します。

// Default error handler
ErrorPageErrorHandler errorHandler = new ErrorPageErrorHandler();
errorHandler.addErrorPage(500,"/error");

// Your webapp
ServletContextHandler context = new ServletContextHandler();
context.setErrorHandler(errorHandler);
context.addServlet(MyCustomErrorServlet.class, "/error");
// etc ...

また、Jetty には が同梱されておりRequestLogHandler、これは同じ最終目標を達成します (ただし、フィルター経由ではなく、Jetty ハンドラーを使用します)。

于 2015-10-20T13:07:27.570 に答える
1

これが私が思いついた解決策です:

Server server = new Server(80);
server.setStopAtShutdown(true);

ServletContextHandler context = new ServletContextHandler();
context.addServlet(Erreur500Servlet.class, "/generate-error-500");
context.addServlet(AresServlet.class, "/ares/*");
context.addFilter(RequestLoggingFilter.class, "/*", EnumSet.of(DispatcherType.REQUEST));

server.setHandler(context);
server.start();
server.join();
于 2015-10-20T14:21:26.393 に答える