2017-02-10 63 views
1
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 java.lang.String中註釋沒有實現。 inject.assistedinject.Assisted(value =)被綁定。 而定位在java.lang.String中

+1

爲什麼在ClassB的構造函數中調用'ClassB'的超類的構造函數?通常不建議這樣做。 –

回答

0

@Assisted與@ com.google.inject.assistedinject.Assisted註解(值=) 爲參數4的assisted injection上下文中,這是一個吉斯功能用於該自動爲您實現一個工廠,將正常的構造函數參數與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)); 

吉斯然後檢查在ClassBFactory接口中,觀察返回值ClassB,將String regionId參數create@Assisted String regionId參數先看你的構造函數,然後將這個ClassBFactory實例提供給你的圖形。此時,您注入的不是注入ClassB,而是注入ClassBFactory,然後撥打classBFactory.create("foo")創建一個ClassB,並將其regionId設置爲"foo"

但是,如果您嘗試注入ClassB而不是ClassBFactory,Guice將不會給您的@Assisted註釋做任何特殊處理,並且將無法注入該字段。搜索代碼庫以查看是否存在工廠接口,如果不存在,則需要創建一個(或者重新設計構造函數)。