class ClassA {
protected ClassA(Injector baseGraph,
BlobStoreContext context,
SwiftApi api,
@Memoized Supplier<Set<? extends Location>> locations,
@Assisted String regionId,PayloadSlicer slicer,
@Named(PROPERTY_USER_THREADS) ListeningExecutorService userExecutor) {
}
}
class ClassB extends ClassA {
protected ClassB(Injector baseGraph,
BlobStoreContext context,
SwiftApi api,
@Memoized Supplier<Set<? extends Location>> locations,
@Assisted String regionId,
PayloadSlicer slicer,
@Named(PROPERTY_USER_THREADS) ListeningExecutorService userExecutor) {
super(baseGraph, context, api, locations, regionId, slicer, userExecutor);
}
}
class C extends AbstractModule {
protected void configure() {
bind(classA).to(classB);
}
}
绑定时,构造函数args中存在一些问题。
错误越来越
引起原因:com.google.inject.CreationException:Guice创建错误:
1)没有绑定以@ com.google.inject.assistedinject.Assisted(value =)注释的java.lang.String的实现。
在定位带有@ com.google.inject.assistedinject.Assisted(value =)注释的java.lang.String时
对于参数4
最佳答案
@Assisted
在assisted injection的上下文中使用,这是Guice功能,可自动为您实现将常规构造函数参数与Guice提供的参数注入混合在一起的工厂。例如,在这里:
class ClassB extends ClassA {
protected ClassB(Injector baseGraph,
BlobStoreContext context,
SwiftApi api,
@Memoized Supplier<Set<? extends Location>> locations,
@Assisted String regionId,
PayloadSlicer slicer,
@Named(PROPERTY_USER_THREADS) ListeningExecutorService userExecutor) {
super(baseGraph, context, api, locations, regionId, slicer, userExecutor);
}
}
我希望看到这个界面:
public interface ClassBFactory {
ClassB create(String regionId);
}
然后将其绑定到您的AbstractModule子类中,如下所示:
install(new FactoryModuleBuilder().build(ClassBFactory.class));
然后,Guice可以检查ClassBFactory接口,观察
ClassB
返回值,将String regionId
的create
参数与构造函数的@Assisted String regionId
参数进行匹配,然后将此ClassBFactory
实例提供给图形。此时,您无需注入ClassB
,而是注入ClassBFactory
,然后调用classBFactory.create("foo")
创建ClassB
,并且将regionId
设置为"foo"
。但是,如果您尝试注入
ClassB
而不是ClassBFactory
,Guice将不会对您的@Assisted
注释进行任何特殊处理,并且将无法注入该字段。搜索您的代码库以查看是否存在工厂接口,如果不存在,则需要创建一个工厂接口(否则将重新设计构造函数)。