使用嵌入式Jetty将参数传递给资源

时间:2013-04-09 04:38:21

标签: java dependency-injection jersey jetty inversion-of-control

我有一个我想要公开的资源,它有一个带有注入参数的构造函数。但是我没有使用任何注入框架,我已经嵌入了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);

或类似的东西?

2 个答案:

答案 0 :(得分:8)

您可以通过向自定义的ResourceConfig注册(Jersey)ServletContainer来将依赖项注入Jersey资源。请查看下面的代码,作为创建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

答案 1 :(得分: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");