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

相关问题