Guice 辅助注入已配置
Guice assistedinject already configured
我对 AssistedInject 有疑问。我遵循了关于此 link 的说明
https://github.com/google/guice/wiki/AssistedInject
但是当我 运行 我的应用程序出现错误时:
ERROR [2015-04-23 14:49:34,701] com.hubspot.dropwizard.guice.GuiceBundle: Exception occurred when creating Guice Injector - exiting
! com.google.inject.CreationException: Unable to create injector, see the following errors:
!
! 1) A binding to java.lang.String annotated with @com.google.inject.assistedinject.Assisted(value=) was already configured at com.demo.migrator.service.democlient.DemoAPIFactory.create().
! at com.demo.migrator.service.democlient.DemoAPIFactory.create(DemoAPIFactory.java:1)
! at com.google.inject.assistedinject.FactoryProvider2.initialize(FactoryProvider2.java:577)
! at com.google.inject.assistedinject.FactoryModuleBuilder.configure(FactoryModuleBuilder.java:335) (via modules: com.demo.migrator.MigrationModule -> com.google.inject.assistedinject.FactoryModuleBuilder)
这是我的模块配置:
install(new FactoryModuleBuilder()
.implement(DemoAPI.class, DemoClient.class)
.build(DemoAPIFactory.class));
这是我的工厂的样子:
public interface DemoAPIFactory {
DemoAPI create(String _apiKey, String _secretKey);
}
接口声明如下:
public interface DemoAPI {
//list of interface methods
}
这是实现
@Inject
public DemoClient(@Assisted String _apiKey,
@Assisted String _secretKey) {
secretKey = _secretKey;
apiKey = _apiKey;
baseURL = "xxxxx";
expirationWindow = 15;
roundUpTime = 300;
base64Encoder = new Base64();
contentType = "application/json";
}
我正在使用 dropwizard guice 包。
为什么会出现这个错误?
这是一个常见问题,解决方案记录在 javadoc 中:
Making parameter types distinct
The types of the factory method's parameters must be distinct. To use
multiple parameters of the same type, use a named @Assisted annotation
to disambiguate the parameters. The names must be applied to the
factory method's parameters:
public interface PaymentFactory {
Payment create(
@Assisted("startDate") Date startDate,
@Assisted("dueDate") Date dueDate,
Money amount); }
...and to the concrete type's constructor parameters:
public class RealPayment implements Payment {
@Inject
public RealPayment(
CreditService creditService,
AuthService authService,
@Assisted("startDate") Date startDate,
@Assisted("dueDate") Date dueDate,
@Assisted Money amount) {
...
} }
我对 AssistedInject 有疑问。我遵循了关于此 link 的说明 https://github.com/google/guice/wiki/AssistedInject 但是当我 运行 我的应用程序出现错误时:
ERROR [2015-04-23 14:49:34,701] com.hubspot.dropwizard.guice.GuiceBundle: Exception occurred when creating Guice Injector - exiting
! com.google.inject.CreationException: Unable to create injector, see the following errors:
!
! 1) A binding to java.lang.String annotated with @com.google.inject.assistedinject.Assisted(value=) was already configured at com.demo.migrator.service.democlient.DemoAPIFactory.create().
! at com.demo.migrator.service.democlient.DemoAPIFactory.create(DemoAPIFactory.java:1)
! at com.google.inject.assistedinject.FactoryProvider2.initialize(FactoryProvider2.java:577)
! at com.google.inject.assistedinject.FactoryModuleBuilder.configure(FactoryModuleBuilder.java:335) (via modules: com.demo.migrator.MigrationModule -> com.google.inject.assistedinject.FactoryModuleBuilder)
这是我的模块配置:
install(new FactoryModuleBuilder()
.implement(DemoAPI.class, DemoClient.class)
.build(DemoAPIFactory.class));
这是我的工厂的样子:
public interface DemoAPIFactory {
DemoAPI create(String _apiKey, String _secretKey);
}
接口声明如下:
public interface DemoAPI {
//list of interface methods
}
这是实现
@Inject
public DemoClient(@Assisted String _apiKey,
@Assisted String _secretKey) {
secretKey = _secretKey;
apiKey = _apiKey;
baseURL = "xxxxx";
expirationWindow = 15;
roundUpTime = 300;
base64Encoder = new Base64();
contentType = "application/json";
}
我正在使用 dropwizard guice 包。
为什么会出现这个错误?
这是一个常见问题,解决方案记录在 javadoc 中:
Making parameter types distinct
The types of the factory method's parameters must be distinct. To use multiple parameters of the same type, use a named @Assisted annotation to disambiguate the parameters. The names must be applied to the factory method's parameters:
public interface PaymentFactory { Payment create( @Assisted("startDate") Date startDate, @Assisted("dueDate") Date dueDate, Money amount); }
...and to the concrete type's constructor parameters:
public class RealPayment implements Payment { @Inject public RealPayment( CreditService creditService, AuthService authService, @Assisted("startDate") Date startDate, @Assisted("dueDate") Date dueDate, @Assisted Money amount) { ... } }