【问题标题】:Guice creation Exception - No bound AssitedGuice 创建异常 - 无绑定辅助
【发布时间】:2017-02-10 06:32:04
【问题描述】:
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.CreationException:Guice 创建错误:

1) 没有绑定带有 @com.google.inject.assistedinject.Assisted(value=) 注释的 java.lang.String 的实现。 定位用@com.google.inject.assistedinject.Assisted(value=) 注释的java.lang.String 对于

处的参数 4

【问题讨论】:

  • 为什么在ClassB的构造函数中调用ClassB的超类的构造函数?通常不建议这样做。

标签: java guice


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-21
    • 1970-01-01
    • 1970-01-01
    • 2018-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多