Dependency injection Guice@Named Annotations don';不适用于相同的对象
我正在开发一个应用程序,其中我使用Guice和Dropwizard。我正在尝试创建两个不同的Jersey客户端(具有不同的配置),以便可以将其用于不同的目的。我正在尝试处理Guice的@Named注释。但是,无论@Named注释中指定的字符串是什么,它都返回相同的对象 下面是我的代码。模块类如下所示: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"
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).