gpt4 book ai didi

java - HK2 IterableProvider 命名方法找不到实现

转载 作者:行者123 更新时间:2023-11-29 05:09:10 24 4
gpt4 key购买 nike

我在尝试注入(inject)绑定(bind)了两个服务的契约(Contract)时遇到问题。

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

在我的一个 Controller 中,我想访问这两个实现,所以我注入(inject)了一个 IterableProvider<Foo> fooProvider .

如果我不指定任何内容,则始终注入(inject)排名最高的实现,这就是我想要的。

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

有人知道我可能遗漏了什么吗?

非常感谢您的帮助。

最佳答案

是的,所以我不确定为什么它不适用于 @Named 注释值,因为这就是 javadoc 中说明的内容,但不需要任何注释,我们可以在进行绑定(bind)时配置名称。我们可以使用 named 来做到这一点方法。

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

更新

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

接口(interface)和实现

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

绑定(bind)。我是在 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

关于java - HK2 IterableProvider 命名方法找不到实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29283176/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com