Java 如何使用Jersey 2.3和嵌入式Jetty在启动时加载servlet

Java 如何使用Jersey 2.3和嵌入式Jetty在启动时加载servlet,java,servlets,jersey,jetty,Java,Servlets,Jersey,Jetty,我正在使用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.ecli

我正在使用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;
    }
}
乌利

您引用的servletHolder.setInitOrder(0)与org.glassfish.jersey.servlet.ServletContainer类相关。jetty-9.0.6中servlet init排序的单元测试正在通过,因此我假设jersey ServletContainer类实际上是按照预期在启动时加载的

也许jersey在1.17版和2.3版之间改变了行为,只是懒洋洋地初始化使用@Path注释映射的资源

或者jersey已经改为使用一些Servlet3.0特性进行初始化,比如ServletContainerInitializers?如果是这种情况,那么您需要从ServletContextHandler升级到WebAppContext,并确保启用对这些Servlet3.0功能的支持(请参阅jetty文档中关于使用嵌入jetty的注释:)

干杯

谢谢你,简。在这方面,1.17和2.3之间的行为可能确实发生了变化。我最终做的是将代码从构造函数移动到其他地方,这样我就可以进行惰性初始化了。