Guice Dependency Injection

lam_tr

Top Contributor
Hallo zusammen,

ich bekomme immer null wenn ich ein Object zurück, das schon im DI Container vorhanden ist, warum?

Ich kann mal Codesegmente hier posten, vielleicht seht ihr das auf anhieb

Hier ist mein Modul:
Code:
public class BaseEmfModule extends AbstractModule {

    @Override
    protected void configure() {
        bind(IEmfControlManager.class).to(EmfControlManager.class).asEagerSingleton();
        bind(IEventBroker.class).to(EventBroker.class).asEagerSingleton();
        bind(ISelectionService.class).to(SelectionService.class).asEagerSingleton();
        bind(EmfWorkbenchRenderer.class).asEagerSingleton();
        bind(EmfWorkbenchFile.class).asEagerSingleton();
        bind(EmfCommandManager.class).asEagerSingleton();
    }
}

An dieser Stelle wird das Modul initialisiert

Code:
public class EmfWorkbenchContext {

    private static final Logger LOG = Logger.getLogger(EmfWorkbenchContext.class.getSimpleName());
   
    private static List<Module> modules = new ArrayList<>();
    private static Injector injector;
   
    private EmfWorkbenchContext() {
        modules.add(new BaseEmfModule());
    }

    /**
     * This step should be done first, before the {@link #init()} method is called.
     * @param module
     */
    public static void add(Module module) {
        modules.add(module);
    }
   
    public static void inject(Object obj) {
        injector.injectMembers(obj);
    }
   
    public static void init() {
        injector = Guice.createInjector(modules);
        LOG.log(Level.ALL, "Initialize Guice for ApplicationContext with SelectionServiceModul!");
    }

    public static <T> T getInstance(Class<T> type) {
        T instance = null;
        try {
            instance = injector.getInstance(type);
        } catch (Exception e) {
            LOG.log(Level.SEVERE, "Failed to get the instance via guice "+e.getLocalizedMessage());
        }
        return instance;
    }
}

über die Demo Klasse wird die Anwendung gestartet
Code:
public class EmfWorkbenchDemo extends AbstractDemoApplication {

    private static ExampleEmfWorkbench workbench;

    @Override
    protected Parent getRoot() {
        return workbench;
    }

   
    public static void main(String[] args) {
        EmfWorkbenchContext.init();
        EmfWorkbenchContext.add(new CommandsModule());
        workbench = EmfWorkbenchContext.getInstance(ExampleEmfWorkbench.class);
        workbench.render();
        launch(args);
    }
}

Im ExampleEmfWorkbench werden die Objekte injected, an der Stelle sind die Services auch vorhanden


Code:
public class ExampleEmfWorkbench extends EmfWorkbench{

    @Inject IEmfControlManager manager;
    @Inject ISelectionService selectionService;
    @Inject IEventBroker eventBroker;
    @Inject EmfWorkbenchRenderer renderer;
   
    public void render() {
        renderer.setWorkbench(this);
        renderer.doSwitch(getWorkbench());
        renderer.doSwitch(getWorkbench().getToolbar());
       
        Perspective firstPerspective = getWorkbench().getPerspectives().get(0);
        renderer.doSwitch(firstPerspective);
    }
...
}

Im Renderer werden die Steuerelemente über eine Xml Datei die Klassen als String gelesen und per Reflection instanziert und in den Workbench ergänzt.

Code:
    @Override
    public Node caseView(View object) {
        try {
            Class clazz = Class.forName(object.getViewClass());
            return (Node) EmfWorkbenchContext.getInstance(clazz);
        } catch (NullPointerException | ClassNotFoundException e) {
            log.log(Level.SEVERE, "Viewpart cannot created (id: "+object.get_Id()+"instance: "+object.getViewClass()+", message: "+e.getMessage()+") ");
        }
        return new Label("ViewPart cannot be created!");
    }

Jetzt kommen wir zum eigentlichen Problem, sobald die View instanziert und über den EmfWorkbenContext geholt wird, wird das Object von Guice in den Container gesteckt oder, sodass die View die ganzen Services injection kann?

Code:
import com.google.inject.Inject;

import de.dc.javafx.xcore.workbench.ui.EmfWorkbenchContext;
import de.dc.javafx.xcore.workbench.ui.control.EmfView;
import de.dc.javafx.xcore.workbench.ui.event.ISelectionService;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.BorderPane;

public class EmfExampleTableView extends EmfView {

        @Inject ISelectionService service;

    public static class Person {

        private final SimpleStringProperty vorname;
        private final SimpleStringProperty nachname;
        private final SimpleIntegerProperty alter;

        private Person(String vName, String nName, int alter) {
            this.vorname = new SimpleStringProperty(vName);
            this.nachname = new SimpleStringProperty(nName);
            this.alter = new SimpleIntegerProperty(alter);
        }

        public String getVorname() {
            return vorname.get();
        }

        public void setVorname(String fName) {
            vorname.set(fName);
        }

        public String getNachname() {
            return nachname.get();
        }

        public void setLastName(String fName) {
            nachname.set(fName);
        }

        public int getAlter() {
            return alter.get();
        }

        public void setAlter(int fAlter) {
            alter.set(fAlter);
        }
    }

    @Override
    protected void createPartControl(BorderPane parent) {
        TableView table = new TableView();
        ObservableList<Person> data = FXCollections.observableArrayList(new Person("Denis", "Panjuta", 28),
                new Person("Hans", "Wurst", 25), new Person("Dieter", "Mieter", 33));

        table.setEditable(true);
       
        TableColumn vorNameCol = new TableColumn("Vorname");
        TableColumn nachNameCol = new TableColumn("Nachname");
        TableColumn alterCol = new TableColumn("Alter");

        table.getColumns().addAll(vorNameCol, nachNameCol, alterCol);

        vorNameCol.setMinWidth(100);
        vorNameCol.setCellValueFactory(new PropertyValueFactory<>("vorname"));

        nachNameCol.setMinWidth(100);
        nachNameCol.setCellValueFactory(new PropertyValueFactory<>("nachname"));

        alterCol.setMinWidth(100);
        alterCol.setCellValueFactory(new PropertyValueFactory<>("alter"));

        table.setItems(data);
       
       
        // An dieser Stelle wird null zurückgegeben
        selectionService.registerProvider(table.getSelectionModel().selectedItemProperty());
       
        // Wenn ich über EmfWorkbenchContext gehe wird das gewollte Object geholt.
        EmfWorkbenchContext.getInstance(ISelectionService.class).registerProvider(table.getSelectionModel().selectedItemProperty());

        parent.setCenter(table);
    }
}

Was ist an der Stelle mein Denkfehler? Vermutlich die Inzierung der View oder das Objekt über getInstance() zu holen oder? Auf jeden Fall bekomme ich an der Stelle mein selectionService nicht.

Viele Grüße
lam
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T GUICE- Dependency Injection- WANN nutze ich Providers? Allgemeine Java-Themen 2
L Compiler-Fehler Google Guice Module zur Laufzeit zusammenstellen und binden Allgemeine Java-Themen 4
L Google Guice Field Injection returns null Allgemeine Java-Themen 2
I WebSockets mit Jersey und Guice Allgemeine Java-Themen 0
M Google Guice (Assisted Injects) - Buggy oder mach ich's falsch? Allgemeine Java-Themen 5
F Google Guice + Generics + Vererbung Allgemeine Java-Themen 5
N Guice - Ohne injector.getInstance Allgemeine Java-Themen 2
F rekursiver Aufruf (Sudoku und Guice) Allgemeine Java-Themen 19
Landei Guice - Injection von "zwischendurch" erzeugten Objekten Allgemeine Java-Themen 4
F DI @SesionScoped Guice Allgemeine Java-Themen 4
Jay_030 Guice + Hibernate = Probleme? Allgemeine Java-Themen 2
Jay_030 Guice: Injector übergeben? Allgemeine Java-Themen 3
Jay_030 Guice: Frage im Umgang mit Unit-Tests Allgemeine Java-Themen 4
DamienX Google Guice AOP + Logging Allgemeine Java-Themen 3
RalleYTN Java 9 Module mit Dependency auf Pre-Java 9 JARS Allgemeine Java-Themen 2
L Dependency Injection für Baum-Einträge Allgemeine Java-Themen 9
L Eigene Dependency Injections definieren? Allgemeine Java-Themen 4
M Maven Dependency aus Projekt nicht aus Repo Allgemeine Java-Themen 3
A Best Practice Unterschied zwischen einer sauberen Dependency Injection und einer statischen Klasse Allgemeine Java-Themen 5
S Suche Dependency Injection Container Allgemeine Java-Themen 6
D Frage zu Dependency Injection (mit Framework) Allgemeine Java-Themen 3
K Dependency Baum erstellen/analysieren Allgemeine Java-Themen 2
K Dependency Walker für Java? Allgemeine Java-Themen 5

Ähnliche Java Themen

Neue Themen


Oben