2017-02-10 3 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); 
    } 
} 

В некоторых конструкторах возникает какая-то проблема при связывании.Создание Guice Исключение - Без привязки Ассистент

ошибка, я получаю

вызвано следующими причинами: com.google.inject.CreationException: Guice ошибки создания:

1) Нет реализации для java.lang.String с аннотацией @ com.google. inject.assistedinject.Assisted (value =) был связан. при размещении java.lang.String аннотации @ com.google.inject.assistedinject.Assisted (значение =) для параметра 4 при

+1

Почему вы вызываете конструктор суперкласса класса ClassB в конструкторе ClassB? Обычно это не рекомендуется. –

ответ

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 eter вашего конструктора, а затем подайте этот пример ClassBFactory на ваш график. В этот момент вместо того, чтобы вводить ClassB, вы вводите ClassBFactory, а затем вызываете classBFactory.create("foo"), чтобы создать ClassB с его regionId, установленным на "foo".

Однако, если вы пытаетесь внедрить ClassB, а не ClassBFactory, Guice не дать вашей @Assisted аннотацию какого-либо специального лечения, и не будет иметь возможность вводить это поле. Найдите свою кодовую базу, чтобы узнать, существует ли заводский интерфейс, а если нет, вам нужно будет создать (или иначе перепроектировать ваш конструктор).

Смежные вопросы