如何在资源构造函数中使用Jersey的@QueryParam和Guice注入?

时间:2016-07-22 16:10:36

标签: java jersey guice

我试图在资源构造函数中一起使用Jersey的@QueryParam和Guice的@Inject。通过网络浏览,我之前遇到了类似的问题:
How can I mix Guice and Jersey injection?
http://users.jersey.dev.java.narkive.com/zlGMXuBe/can-queryparam-be-used-in-resource-constructor-along-with-guice-injection

似乎不可能。但是,这些问题已有几年的历史了,我现在正在尝试做什么呢?

以下是我正在尝试做的一些代码:

@Path("/mypath")
public class MyResource {
  private Manager manager;
  private String type;

  @Inject
  public MyResource(Manager manager,
                    @QueryParam("type") String type) {
    this.manager = manager;
    this.type = type;
  }

  @GET
  @Produces("text/plan")
  @Path("/{period}")
  public String myMethod(@PathParam("period") String period) {
    return manager.foo(period, type);
  }
}

谢谢!

1 个答案:

答案 0 :(得分:1)

它对我有用。也许是与泽西和吉斯的正确绑定有关的问题。

我使用您的资源定义和一些样板代码创建了一个最小的Web应用程序。

首先是应用初始化:

@WebListener
@Singleton
public class AppContextListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        new GuiceBootstrap().contextInitialized(sce);
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        // no op
    }
}

你可以在那里看到我在那里初始化Guice。这是Guice代码。

public class GuiceBootstrap extends GuiceServletContextListener {
    @Override
    protected Injector getInjector() {
        return Guice.createInjector((Module) binder -> binder.bind(Manager.class)
                                                             .to(ManagerImpl.class));
    }
}

它是Java 8语法,但如果您不使用Java 8,它很容易转换为pre-lambda代码。我只用一个绑定创建一个Guice注入器。

Manager和实现类非常简单。

public interface Manager {
    String foo(String period, String type);
}

public class ManagerImpl implements Manager {
    @Override
    public String foo(String period, String type) {
        return "Got " + period + " " + type;
    }
}

最后是初始化Jersey并将其内部注入器(HK2)绑定到Guice的代码。

@ApplicationPath("api")
public class ApiRest extends ResourceConfig {

    @Inject
    public ApiRest(ServiceLocator serviceLocator, ServletContext servletContext) {
        packages("net.sargue.so38531044");
        GuiceBridge.getGuiceBridge().initializeGuiceBridge(serviceLocator);
        GuiceIntoHK2Bridge guiceBridge = serviceLocator.getService(GuiceIntoHK2Bridge.class);
        Injector injector = (Injector) servletContext.getAttribute(Injector.class.getName());
        if (injector == null)
            throw new RuntimeException("Guice Injector not found");
        guiceBridge.bridgeGuiceInjector(injector);
    }
}