3

我有一個資源,我想公開一個具有注入參數的構造函數。不過,我沒有使用任何注入框架,我已經嵌入了Jetty。使用嵌入式Jetty將參數傳遞給資源

眼下碼頭掃描的資源與此:

ServletContextHandler servletContextHandler = new ServletContextHandler(server, "/server"); 
ServletHolder jerseyServletHolder = new ServletHolder(ServletContainer.class); 
jerseyServletHolder.setInitParameter("com.sun.jersey.config.property.packages", "my.package.to.scan"); 
servletContextHandler.addServlet(jerseyServletHolder, "/*"); 

但它使我從注射在構造函數中任何東西,所以我必須使用一個默認的構造函數。

我想指定我自己的實例傳遞給我的資源構造函數。有沒有辦法手動實例化資源並將其添加到servlet容器?

是否有可能做這樣的事情:

MyRestResource resource = new MyRestResource(param1, param2); 
servletContextHandler.addServlet(resource); 

或類似的東西?

+1

你的問題的標題,和你的問題內容2個不同的東西。標題要求如何將信息傳遞給servlet。儘管您的內容會問如何使MyRestResource像servlet一樣運行。 – 2013-04-09 13:28:39

回答

3

如果MyRestResourceServlet,那麼您可以使用existing servlet holder constructor

ServletContextHandler servletContextHandler = new ServletContextHandler(server, "/server"); 
ServletHolder jerseyServletHolder = new ServletHolder(ServletContainer.class); 
jerseyServletHolder.setInitParameter("com.sun.jersey.config.property.packages", "my.package.to.scan"); 
servletContextHandler.addServlet(jerseyServletHolder, "/*"); 
MyRestResource resource = new MyRestResource(param1, param2); 
// wrap resource in a ServletHolder 
ServletHolder resourceHolder = new ServletHolder(resource); 
// assign resource to a Servlet pathSpec 
servletContextHandler.addServlet(resourceHolder, "/rest"); 

如果你有一個servlet,並希望在啓動時訪問一些設置,使用ContextHandler.setAttribute(String, Object)ServletContext.getAttribute(String)技術。

在服務器啓動

ServletContextHandler servletContextHandler = new ServletContextHandler(server, "/server"); 
ServletHolder jerseyServletHolder = new ServletHolder(ServletContainer.class); 
jerseyServletHolder.setInitParameter("com.sun.jersey.config.property.packages", "my.package.to.scan"); 
servletContextHandler.addServlet(jerseyServletHolder, "/*"); 
MyRestResource resource = new MyRestResource(param1, param2); 
// Set resource as a context attribute 
servletContextHandler.setAttribute("rest-1", resource); 

然後訪問後從servlet API

ServletContext ctx = servletRequest.getServletContext(); 
MyRestResource resource = (MyRestResource) ctx.getAttribute("rest-1"); 
+0

如果MyRestResource不擴展Servlet會怎麼樣?我只在MyRestResource類之前使用了諸如「@Path」,「@Produces」,「@Consumes」等的Jersey註釋(或者是javax註解)。擴展Servlet是否合乎邏輯? – Pacane 2013-04-09 15:52:10

+0

如果它不擴展Servlet,那很可能是由澤西島管理。使用Jetty的ServletContextHandler和那種對象是不可能的。在這一點上,你需要專注於使它與澤西及其機制一起工作。 – 2013-04-09 16:18:51

+0

看來,提供的鏈接已死亡 – rpax 2017-02-21 09:30:14

7

您可以通過註冊一個定製ResourceConfig一(新澤西州)ServletContainer依賴注入新澤西州的資源。請查看下面的代碼,以創建一個TimeResource類,並通過構造函數向其中注入時鐘。

public void start() { 
    server = new Server(6666); 
    ServletContextHandler handler = new ServletContextHandler(); 
    handler.setContextPath(""); 
    // adds Jersey Servlet with a customized ResourceConfig 
    handler.addServlet(new ServletHolder(new ServletContainer(resourceConfig())), "/*"); 
    server.setHandler(handler); 
    try { 
     server.start(); 
    } catch (Exception e) { 
     throw new RuntimeException("Could not start the server", e); 
    } 
} 

private ResourceConfig resourceConfig() { 
    // manually injecting dependencies (clock) to Jersey resource classes 
    return new ResourceConfig().register(new TimeResource(clock)); 
} 

的源代碼完整的例子就是可用下:

http://unclejamal.github.io/2013/09/18/manual-dependency-injection-with-jersey-and-embedded-jetty.html

+0

謝謝,這正是我所需要的。 – endian 2015-11-13 13:17:33

相關問題