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

Il y a un problème dans les arguments du constructeur lors de la liaison.Création de Guice Exception - Non lié Assigné

erreur que je reçois

Causée par: com.google.inject.CreationException: Guice erreurs de création:

1) Pas de mise en œuvre pour Java.lang.String annotée avec @ com.google. inject.assistedinject.Assisted (value =) a été lié. tout en localisant Java.lang.String annoté avec @ com.google.inject.assistedinject.Assisted (value =) pour le paramètre à 4

+1

Pourquoi appelez-vous le constructeur de la superclasse de 'ClassB' dans le constructeur' ClassB'? Ceci n'est normalement pas conseillé. –

Répondre

0

@Assisted est utilisé dans le contexte de assisted injection, qui est une caractéristique que Guice implémente automatiquement pour vous une usine qui mélange les paramètres constructeurs normaux avec les injections de paramètres fournies par Guice. Par exemple, ici:

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); 
    } 

} 

j'attendre à voir cette interface:

public interface ClassBFactory { 
    ClassB create(String regionId); 
} 

qui alors vous lier dans votre sous-classe AbstractModule comme ceci:

install(new FactoryModuleBuilder().build(ClassBFactory.class)); 

Guice peut alors inspecter l'interface ClassBFactory, observez la valeur de retour ClassB, faites correspondre le paramètre String regionId de create au paramètre @Assisted String regionId eter de votre constructeur, puis fournissez cette instance ClassBFactory à votre graphique. À ce stade, plutôt que d'injecter ClassB, vous injectez un ClassBFactory puis appelez classBFactory.create("foo") pour créer un ClassB avec son regionId défini sur "foo".

Cependant, si vous essayez d'injecter ClassB plutôt que ClassBFactory, Guice ne donnera pas l'annotation @Assisted un traitement spécial, et ne sera pas en mesure d'injecter ce domaine. Recherchez votre base de code pour voir si une interface d'usine existe, et si ce n'est pas le cas, vous devrez en créer un (ou reconcevoir votre constructeur).