繁体   English   中英

HK2相当于@Provides的Guice for Jersey 2

[英]HK2 equivalent of @Provides in Guice for Jersey 2

我一直在使用Jersey 1.X和Google Guice进行依赖项注入。 切换到Jersey 2.X似乎意味着您需要使用HK2进行依赖项注入,我正在努力寻找Guice中的一些功能。

在带有Guice的Jersey 1.X中,对于该应用程序,我将具有以下内容:

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一样工作的工厂。 这是javadoc 我确实认为这样做不方便,因为您必须创建一个实现Factory的类。 我可能会添加一个增强型Jira以使用CDI样式@Produces。

另外,您可以通过使用Guice-HK2桥继续在泽西岛使用Guice(很多人都这样做)。 使用Bridge时有一些限制(例如必须对Guice创建的类使用@ HK2Inject,但要使用HK2服务进行注入),但是大多数事情仍然可以进行。

好的,所以我想出了一种对我有用的方法。 让我失望的一件事是将bind().to()从Guice交换到HK2。 在Guice中,您写道:

bind(Abstract.class).to(Concrete.class)

如在HK2中,您写道:

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;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM