HK2 IterableProvider命名方法未找到实现

我试图注入一个与它绑定的两个服务的合同时遇到问题。

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

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

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

当我想要一个具体的实现时,问题出现了,其中之一。 当我调用fooProvider.named( nameOfTheClass ).get() ,返回null,但如果我遍历fooProvider,我可以访问这两个实现,因此它们被注入。

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

非常感谢你的帮助。

是的,所以我不确定为什么它不能与@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); } }); 

UPDATE

所以上面的解决方案已经过测试。 如果您仍然遇到问题,请发布一个完整的可运行示例,说明它不起作用,如下所示(这是有效的)

接口和实现

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

结果

在此处输入图像描述