ええ、注釈値で機能しない理由はわかりません。それはjavadoc@Named
で述べられていることですが、注釈を必要とせずに、バインディングを行うときに名前を構成できます。メソッドを使用してこれを行うことができます。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;
}
}
結果
