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

最佳答案

@Assistedassisted 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 regionIdcreate参数与构造函数的@Assisted String regionId参数进行匹配,然后将此ClassBFactory实例提供给图形。此时,您无需注入ClassB,而是注入ClassBFactory,然后调用classBFactory.create("foo")创建ClassB,并且将regionId设置为"foo"

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

09-26 15:13