HK2 IterableProvider命名方法未找到实现

时间:2015-03-26 15:56:11

标签: java dependency-injection jersey jersey-2.0 hk2

尝试使用绑定到它的两个服务注入合同时遇到问题。

我正在使用Jersey,并扩展ResourceConfig来配置我的应用程序,我将两个不同的实现(类FooImpl1FooImpl2)绑定到同一个合同(interface { {1}}),对它们进行不同的排名。这些实现中的每一个都使用Foo及其名称进行注释。

在我的一个控制器中,我想要访问这两个实现,所以我注入@Named

如果我没有指定任何内容,总是会注入排名最高的实现,这就是我想要的。

当我想要一个具体的实现时,就会出现问题。当我调用IterableProvider<Foo> fooProvider时,返回null,但是如果我遍历fooProvider,我可以访问这两个实现,因此它们被注入。

任何人都知道我能错过什么?

非常感谢你的帮助。

1 个答案:

答案 0 :(得分:3)

是的,所以我不确定为什么它不能使用@Named注释值,因为javadoc中的内容是什么,但是不需要任何注释,我们可以在进行绑定时配置名称。我们可以使用named方法完成此操作。

register(new AbstractBinder(){
    @Override
    public void configure() {
        bind(Foo1Impl.class).named("foo1").to(Foo.class);
        bind(Foo2Impl.class).named("foo2").to(Foo.class);
    }
});

更新

因此上述解决方案已经过测试。如果您仍然遇到问题,请发布一个完整的可运行示例,证明它不起作用,如下所示(正在运行)

接口和实现

public interface Greeter {
    String getGreeting(String name);
}

public class EnglishGreeter implements Greeter {
    @Override
    public String getGreeting(String name) {
        return "Hello " + name + "!";
    }
}

public class SpanishGreeter implements Greeter {
    @Override
    public String getGreeting(String name) {
        return "Hola " + name + "!";
    }
}

资源

@Path("greeting")
public class GreetingResource {

    @Inject
    private IterableProvider<Greeter> greeters;

    @GET
    public Response getResponse(@QueryParam("lang") String lang,
                                @QueryParam("name") String name) throws Exception {

        Greeter greeter = greeters.named(lang).get();
        String message = greeter.getGreeting(name);
        return Response.ok(message).build();
    }
}

结合。我是在Feature中完成的,但在ResourceConfig中,它完全相同。

@Provider
public class GreetingFeature implements Feature {
    @Override
    public boolean configure(FeatureContext context) {
        context.register(new AbstractBinder(){
            @Override
            public void configure() {
                bind(EnglishGreeter.class).named("english")
                        .to(Greeter.class).in(Singleton.class);
                bind(SpanishGreeter.class).named("spanish")
                        .to(Greeter.class).in(Singleton.class);
            }
        });
        return true;
    }  
}

结果

enter image description here