Guice创建异常 - 无绑定Assited

时间:2017-02-10 06:32:05

标签: java 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);
    }
}

绑定时构造函数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

1 个答案:

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