4

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

或类似的东西?

4

2 回答 2

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

于 2013-09-19T23:01:56.743 回答
3

如果MyRestResource是 a Servlet,那么您可以使用现有的 servlet holder 构造函数

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");
于 2013-04-09T13:35:26.773 回答