Dependency injection Guice@Named Annotations don';不适用于相同的对象

Dependency injection Guice@Named Annotations don';不适用于相同的对象,dependency-injection,annotations,guice,dropwizard,Dependency Injection,Annotations,Guice,Dropwizard,我正在开发一个应用程序,其中我使用Guice和Dropwizard。我正在尝试创建两个不同的Jersey客户端(具有不同的配置),以便可以将其用于不同的目的。我正在尝试处理Guice的@Named注释。但是,无论@Named注释中指定的字符串是什么,它都返回相同的对象 下面是我的代码。模块类如下所示: public class AppModule extends AbstractModule { @Provides @Singleton @Named ("clientA"

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

下面是我的代码。模块类如下所示:

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;
    }

}
在这里,它将打印“客户端A的内部提供者”或“客户端B的内部提供者”。printClients()方法中clientA和clientB的值将是相同的

如果有时它同时打印“客户端A的内部提供者”和“客户端B的内部提供者”,那么它将抛出一个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).
我试着用不同的名字注释字符串。它还将给出相同的字符串,而不考虑注释

当我用“clientA”和“clientB”注释时,我期待着不同的客户,但是在尝试了很多并在互联网上搜索之后,我认为这并不是真正可以实现的。还是我在这里遗漏了什么

任何关于这个问题的建议或解决方法都会非常有帮助


谢谢。

您使用
@Named
配置的GUI是正确的;您的两次注入没有理由使用相同的
@方法实现。我不认为这是Guice的问题。您是否可以尝试重新运行测试但不记录日志,而不是在日志中隐式使用
clientA.toString()
,以及
clientB
?如果它们相同,您的客户端生成器是否可能会两次返回同一实例?附加说明:您的错误消息可能只是因为在两个客户端之间重用了环境对象,如中所示。使用
System.identityHashCode()登录会为两个对象打印相同的哈希代码。我认为这两个对象只调用了一个客户端提供者。有没有办法解决这个问题?这真的很奇怪。多次运行同一代码会产生不同的结果。有时,它会为两个注释创建相同的
客户端。其他时候,它尝试创建两个不同的
客户端
,结果抛出一个
非法argumentexception:一个名为org.apache.http.conn.HttpClientConnectionManager.AutomatedThresholdApplication.available-connections的度量已经存在
请添加应用程序的独立示例,包括一个我可以运行的主管道,这样我就可以看到发生了什么。关于如何将所有内容组合在一起,您的示例不完整。您使用
@Named
配置的Guice是正确的;您的两次注入没有理由使用相同的
@方法实现。我不认为这是Guice的问题。您是否可以尝试重新运行测试但不记录日志,而不是在日志中隐式使用
clientA.toString()
,以及
clientB
?如果它们相同,您的客户端生成器是否可能会两次返回同一实例?附加说明:您的错误消息可能只是因为在两个客户端之间重用了环境对象,如中所示。使用
System.identityHashCode()登录会为两个对象打印相同的哈希代码。我认为这两个对象只调用了一个客户端提供者。有没有办法解决这个问题?这真的很奇怪。多次运行同一代码会产生不同的结果。有时,它会为两个注释创建相同的
客户端。其他时候,它尝试创建两个不同的
客户端
,结果抛出一个
非法argumentexception:一个名为org.apache.http.conn.HttpClientConnectionManager.AutomatedThresholdApplication.available-connections的度量已经存在
请添加应用程序的独立示例,包括一个我可以运行的主管道,这样我就可以看到发生了什么。你的例子不完全说明所有东西是如何组合在一起的。
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).