2013-10-23 71 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

相關問題