Внедрение зависимостей не выполняется в классе контроллера FXML - PullRequest
0 голосов
/ 25 января 2019

Я пишу приложение JavaFX и пытаюсь интегрировать DI с Dagger / Guice, но у меня возникают проблемы с внедрением в класс FXML Initializable. В основном я копирую код отсюда: https://bitbucket.org/gluon-oss/ignite/src/c85197b33852/src/test/java/com/gluonhq/ignite/?at=default

Впрыск работает отлично в основном классе (App.java). Вот класс, где инъекция терпит неудачу:

public class FXMLController implements Initializable {

    @FXML
    private Label label;

    @Inject
    ConnectionManager connectionManager;

    @Override
    public void initialize(URL url, ResourceBundle rb) {
        //do something with connectionManager
    }
}

По сути, происходит следующее: когда я пытаюсь внедрить кинжал, он просто не открывает сцену, а при инъекции с хитростью выдает «Исключение в методе запуска приложения».

Остальной код:

DaggerModule для версии кинжала:

@Module(library = true, injects = {App.class, FXMLController.class}, complete = false)
public class DaggerModule {

    @Provides
    FXMLLoader provideFxmlLoader() {
        return new FXMLLoader();
    }

    @Provides
    ConnectionManager provideConnectionManager() {
        return new ConnectionManager();
    }
}

GuiceModule для версии guice:

public class GuiceModule extends AbstractModule {
    @Override
    protected void configure() {
        bind(ConnectionManager.class);
    }
}

Основной класс:

public class App extends Application {

//    private final DaggerContext context = new DaggerContext(this, () -> Arrays.asList(new DaggerModule()));
    private GuiceContext context = new GuiceContext(this, () -> Arrays.asList(new GuiceModule()));

    @Inject
    public ConnectionManager connectionManager;

    @Inject
    public FXMLLoader loader;

    @Override
    public void start(Stage stage) throws Exception {
        context.init();
        Parent root = (Parent) loader.load(getClass().getResource("scene.fxml"));

        Scene scene = new Scene(root);
        scene.getStylesheets().add(getClass().getResource("styles.css").toExternalForm());

        stage.setOnCloseRequest(e -> Platform.exit());

        stage.setTitle("title");
        stage.setScene(scene);
        stage.show();

        connectionManager.initConnection();

    }

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void stop() throws Exception {
        super.stop();
        System.exit(0);
    }
}

Есть идеи, в чем здесь проблема?

...