2013-10-23 30 views
1

我正在使用Jetty 9.0.6将Jersey Jersey Web应用程序从Jersey 1.17.1迁移到2.3.1。使用Jersey 1.17.1,资源将在启动过程中加载。然而,几乎相同的代码(下面)仅在请求进入时才开始。但是我想确保它在启动过程中被加载(即调用带注释的资源类的构造函数)。任何想法有什么不对?如何在启动时使用带有嵌入式Jetty的Jersey 2.3加载servlet

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; 
    } 
} 

回答

0

乌利,

的servletHolder.setInitOrder(0)你指的是关系到org.glassfish.jersey.servlet.ServletContainer类。在jetty-9.0.6中servlet初始化排序的单元测试正在通过,所以我认为该平台的ServletContainer类实际上是按照预期在启动时加载的。

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

或者泽西岛已经改变为使用一些servlet 3.0功能进行初始化,如ServletContainerInitializers?如果是这种情况,那么您需要从ServletContextHandler升级到WebAppContext,并确保已启用对这些servlet 3.0功能的支持(请参阅有关使用带有嵌入式码头的注释的码头文档:http://www.eclipse.org/jetty/documentation/current/using-annotations-embedded.html

欢呼声 Jan

+0

谢谢,1月。这可能确实是1.17和2.3之间的行为在这方面发生了变化。我最终做的是将代码从构造函数移动到其他位置,这样我就可以很好地进行延迟初始化。 – Uli

相关问题