gpt4 book ai didi

java - Guice 创建异常 - 无限制辅助

转载 作者:太空宇宙 更新时间:2023-11-04 11:47:54 26 4
gpt4 key购买 nike

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

绑定(bind)时构造函数参数存在一些问题。

出现错误

Caused by: com.google.inject.CreationException: Guice creation errors:

1) No implementation for java.lang.String annotated with @com.google.inject.assistedinject.Assisted(value=) was bound. while locating java.lang.String annotated with @com.google.inject.assistedinject.Assisted(value=) for parameter 4 at

最佳答案

@Assistedassisted injection 的上下文中使用,这是一个 Guice 功能,它会自动为您实现一个工厂,将普通构造函数参数与 Guice 提供的参数注入(inject)混合在一起。例如,这里:

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

然后您可以将其绑定(bind)到 AbstractModule 子类中,如下所示:

install(new FactoryModuleBuilder().build(ClassBFactory.class));

Guice 然后可以检查 ClassBFactory 接口(interface),观察 ClassB 返回值,将 createString RegionId 参数与构造函数的 @Assisted String RegionId 参数相匹配,然后将此 ClassBFactory 实例提供给您的图表。此时,您无需注入(inject) ClassB,而是注入(inject)一个 ClassBFactory,然后调用 classBFactory.create("foo") 创建一个 ClassB,并将其 regionId 设置为 "foo"

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

关于java - Guice 创建异常 - 无限制辅助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42152893/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com