2016-11-18 4 views
-1

Ich habe den folgenden KonstruktorGuice Bindung nicht mit @Named Anmerkung gemacht

@Inject 
public MyClass(Provider<TestClass> testProvider, @Named("myName") String name) { 
    //constructor stuff 
} 

Mein Modul:

@Provides 
@Named("myName") 
public String getName(SomeObject object) { 
    return object.getName(); 
} 

Das Problem ist, dass Guice die Bindung nicht tun.

Jetzt, wenn ich die @Named Annotation entfernen, funktioniert es. Die getName() Methode wird erfolgreich aufgerufen. Beim Hinzufügen der @Named Annotation wird getName() nie aufgerufen, und mein Konstruktor wird schließlich mit einer leeren Zeichenfolge injiziert.

Nur eine meiner Methoden kommentierten mit @Provides gibt ein String, aber ich würde es immer noch gerne nennen, da String ein ziemlich häufiges Objekt ist, das injiziert werden könnte.

Ich habe versucht, auch innerhalb der configure() Methode der Bindung (wie in der Dokumentation, aber immer noch nichts

Wer weiß, was ich vermisse ich die Dokumentation ohne Erfolg geprüft

EDIT.?.: ich bin sicher, dass meine Importe für mich richtig

+0

Der Code, den Sie haben, sieht vollkommen vernünftig aus; Sie verwenden 'Named' korrekt. Sind Sie sich 100% sicher, dass es sich hierbei nicht um veraltete Build-Artefakte oder nicht gespeicherte Dateien handelt? –

+0

Überprüfen Sie einfach Ihre Importe von 'Named' Annotation. –

+0

Das sind meine Importe: 'import com.google.inject.name.Named;' Sehr seltsam. Ich werde noch eine Fehlerbehebung versuchen. Vielleicht stimmt etwas nicht mit meiner Umgebung. – Tiberiu

Antwort

1

Werke sind hier der Code ich zu überprüfen, verwendet (guice 4.0.):

package guice; 

import com.google.inject.*; 
import com.google.inject.name.Named; 


public class Main { 
    public static void main(String[] args) { 
     Guice.createInjector(new MyModule()).getInstance(MyClass.class); 
    } 
} 

class MyClass { 
    @Inject 
    public MyClass(Provider<TestClass> testProvider, @Named("myName") String name) { 
     System.out.println(name); 
    } 
} 

class MyModule extends AbstractModule { 
    @Override 
    protected void configure() { 
    } 

    @Provides 
    @Named("myName") 
    public String getName(SomeObject object) { 
     return object.getName(); 
    } 
} 

class SomeObject { 
    public String getName() { 
     return "helloWorld"; 
    } 
} 

class TestClass { 
} 

drucken s "HelloWorld" wie erwartet.

Verwandte Themen