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
答案 0 :(得分:0)
@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
注释任何特殊处理,并且无法注入该字段。搜索代码库以查看是否存在工厂接口,如果不存在,则需要创建一个(或者重新设计构造函数)。