尝试使用绑定到它的两个服务注入合同时遇到问题。
我正在使用Jersey,并扩展ResourceConfig
来配置我的应用程序,我将两个不同的实现(类FooImpl1
和FooImpl2
)绑定到同一个合同(interface { {1}}),对它们进行不同的排名。这些实现中的每一个都使用Foo
及其名称进行注释。
在我的一个控制器中,我想要访问这两个实现,所以我注入@Named
。
如果我没有指定任何内容,总是会注入排名最高的实现,这就是我想要的。
当我想要一个具体的实现时,就会出现问题。当我调用IterableProvider<Foo> fooProvider
时,返回null,但是如果我遍历fooProvider,我可以访问这两个实现,因此它们被注入。
任何人都知道我能错过什么?
非常感谢你的帮助。
答案 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;
}
}
结果