Guice @Named Annotations不适用于相同的对象

时间:2017-02-24 20:51:29

标签: dependency-injection annotations guice dropwizard

我正在开发一个应用程序,我使用Guice和Dropwizard。我正在尝试创建两个不同的Jersey客户端(具有不同的配置),以便我可以将它用于不同的目的。我正在尝试使用Guice的@Named Annotation。但是,它返回相同的对象,而不管@Named注释中指定的字符串。

以下是我的代码。 Module类看起来像这样:

public class AppModule extends AbstractModule {
    @Provides
    @Singleton
    @Named ("clientA")
    public Client providesClientA(Provider<AppConfiguration> appConfigProvider, Environment env) {
        log.info("Inside provider of Client A");
        JerseyClientConfiguration configuration = appConfigProvider.get().getJerseyClientConfigurationA();
        configuration.setTimeout(Duration.seconds(10));
        final Client client = new JerseyClientBuilder(environment).using(configuration).using(environment)
            .build(environment.getName());
        return client;
    }

    @Provides
    @Singleton
    @Named ("clientB")
    public Client providesClientB(Provider<AppConfiguration> appConfigProvider, Environment env) {
        log.info("Inside provider of Client B");
        JerseyClientConfiguration configuration = appConfigProvider.get().getJerseyClientConfigurationB();
        configuration.setTimeout(Duration.seconds(125));
        final Client client = new JerseyClientBuilder(environment).using(configuration).using(environment)
            .build(environment.getName());
        return client;
    }

}

注入这两个客户端的类如下所示:

public ClassApp {
    private Client clientA;
    private Client clientB;

    @Inject
    public ClassApp(@Named ("clientA") Client clientA,
              @Named ("clientB") Client clientB) {
        this.clientA = clientA;
        this.clientB = clientB;
    }

    public void printClients() {
         log.info("Client A is " + clientA);
         log.info("Client B is " + clientB);
    }
}

此处,它将打印&#34;客户A的内部提供商&#34;或&#34;客户B&#34;的内部提供商。而printClients()方法中clientA和clientB的值将是相同的。

如果有时会打印两者,即#34;客户A的内部提供商&#34;和&#34;客户B&#34;的内部提供者,然后它将抛出如下所述的IllegalArgumentException。

Error in custom provider, java.lang.IllegalArgumentException: A metric named org.apache.http.conn.HttpClientConnectionManager.AutomatedThresholdApplication.available-connections already exists
while locating javax.ws.rs.client.Client annotated with @com.google.inject.name.Named(value=clientA).

我尝试使用带有不同名称的String注释。无论注释如何,它也会提供相同的String。

我期待不同的客户使用&#34; clientA&#34;和&#34; clientB&#34;,但经过大量尝试并在互联网上搜索后,我认为这不是真的可以实现的。或者我在这里缺少什么?

针对此问题的任何指示或建议或解决方法都会有很大帮助。

感谢。

0 个答案:

没有答案