Java HK2相当于@为泽西岛2提供Guice

Java HK2相当于@为泽西岛2提供Guice,java,dependency-injection,jersey,guice,hk2,Java,Dependency Injection,Jersey,Guice,Hk2,我一直在使用Jersey 1.X和GoogleGuice进行依赖注入。切换到Jersey 2.X似乎意味着您需要使用HK2来替代依赖注入,我正在努力找到Guice中的一些东西 在Jersey 1.X和Guice中,我将为应用程序提供如下内容: public class GuiceServletTestConfig extends GuiceServletContextListener { @Override protected Injector getInjector() {

我一直在使用Jersey 1.X和GoogleGuice进行依赖注入。切换到Jersey 2.X似乎意味着您需要使用HK2来替代依赖注入,我正在努力找到Guice中的一些东西

在Jersey 1.X和Guice中,我将为应用程序提供如下内容:

public class GuiceServletTestConfig extends GuiceServletContextListener  {
    @Override
    protected Injector getInjector() {
        return Guice.createInjector(new ServletModule(){
            @Override
            protected  void configureServlets(){
                bind(MyResource.class);
                serve("/*").with(GuiceContainer.class);
                bind(MyDAO.class).to(MyDAOSQL.class)
            }
        });
    }
}
对于测试,类似这样的东西:

public class GuiceServletTestConfig extends GuiceServletContextListener  {
    @Override
    protected Injector getInjector() {
        return Guice.createInjector(new ServletModule(){
            @Override
            protected  void configureServlets(){
                bind(MyResource.class);
                serve("/*").with(GuiceContainer.class);
            }

            @Provides
            MyDAO provideMockMyDAO(){
                MyDAO dao = mock(MyDAO.class);
                return dao;
            }
        });
    }
}
我的任何重选都会是这样的:

@Path("myresource")
public class MyResource {
    private MyDAO myDAO;

    @Inject
    protected void setMyDAO(MyDAO myDAO) {
        this.myDAO = myDAO;
    }

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Response get() {
        // Do something with myDAO
        // Return response    
    }
}
那就是我可以为我的测试定义模拟,一切都很好

但是,对于Jersey 2.X,我找不到@Provides注释的任何等效项。MyResource实际上是相同的。对于实际应用程序的依赖项注入,我有:

public class Application extends ResourceConfig {
    public Application() {
        packages("com.my.package.resources");

        register(new AbstractBinder() {
            @Override
            protected void configure() {
                bind(MyDAOSQL.class).to(MyDAO.class);
            }
        });
    }
}

但我不知道如何为测试提供模拟。有人知道怎么做吗?

HK2允许您绑定像@Provides一样工作的工厂。这是你的电话号码。我确实认为这样做并不方便,因为您必须创建一个实现Factory的类。我可能会添加一个增强Jira来做CDI风格的@products


此外,您还可以继续在Jersey中使用Guice(许多人都这样做),方法是使用。在使用网桥时有一些限制(比如必须对Guice创建的类使用@HK2Inject,但要注入HK2服务),但大多数事情仍然有效。

好的,所以我找到了一种适合我的方法。有一件事让我很反感,那就是将
bind().to()
从Guice交换到HK2。在Guice中,您可以编写:

bind(Abstract.class).to(Concrete.class)
bind(Concrete.class).to(Abstract.class)
如在HK2中,您写道:

bind(Abstract.class).to(Concrete.class)
bind(Concrete.class).to(Abstract.class)
获取提供行为的方法可以通过以下代码实现:

public class MyResourceIT extends JerseyTest {
    @Override
    protected Application configure() {
        ResourceConfig resourceConfig = new ResourceConfig();
        resourceConfig.register(MyResource.class);

        resourceConfig.register(new AbstractBinder() {
            @Override
            protected void configure() {
                bind(provideMyDaoMock()).to(MyDao.class);
            }

            private MyDao provideMyDaoMock() {
                MyDao myDaoMock = mock(MyDao.class);
                return myDaoMock;
            }
        });
        return resourceConfig;
    }
}

如果你想继续使用Guice,考虑切换到。它是JAX-RS 2的一个实现,并且完全兼容GUI。是的,我们切换了它们,现在您可以像绑定(Concrete.class).to(interfaceea.class).to(InterfaceB.class)一样