1

2 つのサービスがバインドされたコントラクトを挿入しようとすると問題が発生します。

私はジャージーを使用しておりResourceConfig、アプリを構成するために拡張しています.2つの異なる実装(クラスFooImpl1FooImpl2)を同じコントラクト(インターフェースFoo)にバインドし、それらを異なる方法でランク付けしています。これらの各実装には、@Namedとその名前の注釈が付けられています。

コントローラーの 1 つで、両方の実装にアクセスしたいので、IterableProvider<Foo> fooProvider.

何も指定しない場合、最高ランクの実装が常に注入されます。これが私が望んでいることです。

問題は、そのうちの 1 つである具体的な実装が必要な場合に発生します。を呼び出すとfooProvider.named( nameOfTheClass ).get()、null が返されますが、fooProvider を反復処理すると、両方の実装にアクセスできるため、それらが注入されます。

誰が私が欠けている可能性があるのか​​ 考えていますか?

どうもありがとうございました。

4

1 に答える 1

3

ええ、注釈値で機能しない理由はわかりません。それは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;
    }  
}

結果

ここに画像の説明を入力

于 2015-03-27T13:56:58.513 に答える