2

Jetty 9.0.6 を使用して、Jersey Web アプリケーションを Jersey 1.17.1 から 2.3.1 に移行しています。Jersey 1.17.1 では、リソースは起動時にロードされます。ただし、ほぼ同じコード (以下) は、リクエストが入ったときにのみ開始されます。ただし、起動時にロードされることを確認したいと思います (つまり、注釈付きリソース クラスのコンストラクターが呼び出されます)。何が問題なのですか?

public static void startServer(){
    org.eclipse.jetty.server.Server server = new Server();
    org.eclipse.jetty.servlet.ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
    context.setContextPath("/");
    server.setHandler(context);
    org.glassfish.jersey.servlet.ServletContainer servletContainer = new ServletContainer();
    org.eclipse.jetty.servlet.ServletHolder servletHolder = new ServletHolder(servletContainer);
    servletHolder.setInitParameter(ServerProperties.PROVIDER_PACKAGES, "mypackage");
    servletHolder.setInitOrder(0);  // this does not seem to work
    context.addServlet(servletHolder, "/*");
    server.start();
}

そしておおよそ:

package mypackage;

@Singleton
@Path("/foo")
public class MyResource {

    public MyResource(){
        // I want this to be called when I start the server
    }

    @Path("bar")
    public Response receivePayload(@Context HttpServletRequest request, String payloadString){
        // do some stuff
        return response;
    }
}
4

1 に答える 1

0

ウリ、

参照している servletHolder.setInitOrder(0) は org.glassfish.jersey.servlet.ServletContainer クラスに関連しています。jetty-9.0.6 でのサーブレットの初期化順序付けの単体テストはパスしているため、ジャージの ServletContainer クラスが実際に起動時に期待どおりにロードされていると思います。

おそらく jersey はバージョン 1.17 と 2.3 の間で動作を変更し、@Path アノテーションを使用してマップされたリソースを遅延初期化するだけでしょうか?

それとも、ServletContainerInitializers などの初期化にいくつかのサーブレット 3.0 機能を使用するように jersey が変更されたのでしょうか? その場合は、ServletContextHandler から WebAppContext にアップグレードし、これらのサーブレット 3.0 機能のサポートが有効になっていることを確認する必要があります (jetty が埋め込まれたアノテーションの使用に関する jetty ドキュメントを参照してください: http://www. eclipse.org/jetty/documentation/current/using-annotations-embedded.html )

乾杯ジャン

于 2013-10-23T23:47:35.023 に答える