我如何才能让Jersey注入类,而无需一对一地创建和注册工厂?

我有以下配置:

public class MyConfig extends ResourceConfig {
    public MyConfig() {
        register(new AbstractBinder() {
            @Override
            protected void configure() {
                bindFactory(FooFactory.class).to(Foo.class);
                bindFactory(BazFactory.class).to(Baz.class);
            }
        });
    }
}


hk2现在将成功注入Foo和Baz:

// this works; Foo is created by the registered FooFactory and injected
@GET
@Path("test")
@Produces("application/json")
public Response getTest(@Context Foo foo) {
    // code
}


但这不是我的目标。我的目标是注入包装这些类的对象。有很多,它们各自消耗Foo和Baz的不同组合。一些例子:

public class FooExtender implements WrapperInterface {

    public FooExtender(Foo foo) {
        // code
    }
}

public class FooBazExtender implements WrapperInterface {

    public FooBazExtender(Foo foo, Baz baz) {
        // code
    }
}

public class TestExtender implements WrapperInterface {

    public TestExtender(Foo foo) {
        // code
    }
    // code
}


等等。

以下内容不起作用:

// this does not work
@GET
@Path("test")
@Produces("application/json")
public Response getTest(@Context TestExtender test) {
    // code
}


我可以为每个工厂创建一个工厂,并使用bindFactory语法在我的应用程序配置类中注册它,就像我对Foo和Baz所做的那样。但是,由于所涉及的对象数量众多,所以这不是一个好方法。

我已经阅读了很多hk2文档,并尝试了多种方法。我只是不太了解hk2的实际工作原理,因此无法给出答案,而且似乎已经很常见了,应该有一个简单的解决方案。

最佳答案

实际上,只有在进行更复杂的初始化时才需要工厂。如果您不需要此功能,则只需绑定服务即可

@Override
protected void configure() {
    // bind service and advertise it as itself in a per lookup scope
    bindAsContract(TestExtender.class);
    // or bind service as a singleton
    bindAsContract(TestExtender.class).in(Singleton.class);
    // or bind the service and advertise as an interface
    bind(TestExtender.class).to(ITestExtender.class);
    // or bind the service and advertise as interface in a scope
    bind(TestExtender.class).to(ITestExtender.class).in(RequestScoped.class);
}


您还需要在构造函数上添加@Inject,以便HK2知道注入FooBaz

@Inject
public TestExtender(Foo foo, Baz baz) {}

关于java - 让HK2和Jersey注入(inject)类(class),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49327986/

10-10 01:08