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

Pac*_*ane 4 java dependency-injection jetty jersey 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, "/*");
Run Code Online (Sandbox Code Playgroud)

但它阻止我在构造函数中注入任何东西,所以我必须使用默认构造函数.

我想指定我自己的实例传递给我的资源构造函数.有没有办法手动实例化资源并将其添加到servlet容器?

有可能做这样的事情:

MyRestResource resource = new MyRestResource(param1, param2);
servletContextHandler.addServlet(resource);
Run Code Online (Sandbox Code Playgroud)

或类似的东西?

Paw*_*uda 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));
}
Run Code Online (Sandbox Code Playgroud)

以下是完整的源代码示例:

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