HK2 IterableProvider 命名方法找不到实现
HK2 IterableProvider named method not finding Implementation
我在尝试注入绑定了两个服务的合同时遇到问题。
我正在使用 Jersey,并扩展 ResourceConfig
来配置我的应用程序,我将两个不同的实现(类 FooImpl1
和 FooImpl2
)绑定到同一份合约(接口 Foo
),对它们的排名不同。这些实现中的每一个都用 @Named
及其名称进行注释。
在我的一个控制器中,我想访问这两种实现,所以我注入了一个 IterableProvider<Foo> fooProvider
.
如果我没有指定任何东西,那么总是注入排名最高的实现,这就是我想要的。
当我想要一个具体的实现时,问题就出现了,其中之一。当我调用 fooProvider.named( nameOfTheClass ).get()
时返回 null,但如果我遍历 fooProvider,我可以访问这两个实现,因此它们被注入。
有人知道我可能遗漏了什么吗?
非常感谢您的帮助。
是的,所以我不确定为什么它不适用于 @Named
注释值,因为这就是 javadoc, but without the need for any annotations, we can configure the name when we do our bindings. We can do so with the named
方法中的说明。
register(new AbstractBinder(){
@Override
public void configure() {
bind(Foo1Impl.class).named("foo1").to(Foo.class);
bind(Foo2Impl.class).named("foo2").to(Foo.class);
}
});
更新
所以上面的方案已经测试过了。如果您仍然遇到问题,post 一个完整的可运行示例,证明它不起作用,如下所示(正在运行)
接口和实现
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;
}
}
结果
我在尝试注入绑定了两个服务的合同时遇到问题。
我正在使用 Jersey,并扩展 ResourceConfig
来配置我的应用程序,我将两个不同的实现(类 FooImpl1
和 FooImpl2
)绑定到同一份合约(接口 Foo
),对它们的排名不同。这些实现中的每一个都用 @Named
及其名称进行注释。
在我的一个控制器中,我想访问这两种实现,所以我注入了一个 IterableProvider<Foo> fooProvider
.
如果我没有指定任何东西,那么总是注入排名最高的实现,这就是我想要的。
当我想要一个具体的实现时,问题就出现了,其中之一。当我调用 fooProvider.named( nameOfTheClass ).get()
时返回 null,但如果我遍历 fooProvider,我可以访问这两个实现,因此它们被注入。
有人知道我可能遗漏了什么吗?
非常感谢您的帮助。
是的,所以我不确定为什么它不适用于 @Named
注释值,因为这就是 javadoc, but without the need for any annotations, we can configure the name when we do our bindings. We can do so with the named
方法中的说明。
register(new AbstractBinder(){
@Override
public void configure() {
bind(Foo1Impl.class).named("foo1").to(Foo.class);
bind(Foo2Impl.class).named("foo2").to(Foo.class);
}
});
更新
所以上面的方案已经测试过了。如果您仍然遇到问题,post 一个完整的可运行示例,证明它不起作用,如下所示(正在运行)
接口和实现
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;
}
}
结果