Guice创建异常-未分配绑定


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

绑定时构造函数参数中存在一些问题。

获取时出错

由com.google.inject.CreateException引起:Guice创建错误:

1) 没有绑定用@com.google.inject.assistantedject.Assistanted(value=)注释的java.lang.String的实现。查找用@com.google.inject.assistantedject.Assistanted(value=)注释的java.lang.String时对于的参数4

@Assisted用于辅助注入的上下文,这是一个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返回值,将createString regionId参数与构造函数的@Assisted String regionId参数匹配,然后将此ClassBFactory实例提供给图。此时,不是注入ClassB,而是注入ClassBFactory,然后调用classBFactory.create("foo")来创建ClassB,其regionId设置为"foo"

但是,如果您尝试注入ClassB而不是ClassBFactory,则Guice不会对@Assisted注释进行任何特殊处理,并且将无法注入该字段。搜索你的代码库,看看是否存在工厂接口,如果不存在,你需要创建一个(或者重新设计你的构造函数)。

最新更新