首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Guice NullPointerExceptions

Guice NullPointerExceptions
EN

Stack Overflow用户
提问于 2018-03-19 15:55:37
回答 1查看 106关注 0票数 0

因此,我对Guice很陌生,每当我尝试使用我的注入对象时,我都会不断地获得NullPointerException

起初我认为这是我的程序的奇怪的复杂性,但我创建了一个非常非常简单的测试程序,但我仍然得到了它们。方案如下:

Main.java

代码语言:javascript
复制
public class Main  extends Application{
    public static void main(String[] args) {
        launch(Main.class);
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        Injector injector = Guice.createInjector(new BillingModule());

        Parent p = FXMLLoader.load(getClass().getResource("addtest.fxml"));

        primaryStage.setScene(new Scene(p, 100, 100));
        primaryStage.show();
    }
}

BillingModule.java

代码语言:javascript
复制
public class BillingModule extends AbstractModule {
    @Override
    protected void configure() {
        bind(Add.class).to(AddImpl.class);
    }
}

添加接口

代码语言:javascript
复制
public interface Add {
   int add(int a, int b);
}

AddImpl

代码语言:javascript
复制
public class AddImpl implements Add{
    public int add(int a, int b) {
        return a+b;
    }
}

FXML控制器

代码语言:javascript
复制
public class AddTestController {
    @Inject private Add add;
    public void initialize(){}
    @FXML
    private void addTestButton(){
        System.out.println(add.add(1,3));
    }
}

FXML文件

代码语言:javascript
复制
<AnchorPane prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.121" xmlns:fx="http://javafx.com/fxml/1" fx:controller="AddTestController">
   <children>
      <Button mnemonicParsing="false" onAction="#addTestButton" text="Button" />
   </children>
</AnchorPane>

正如你所看到的,这是一个非常简单的程序,而我似乎仍然无法让它发挥作用。

我的目标是在不需要调用injector.getInstance(Add.class)的情况下注入injector.getInstance(Add.class),而是查看@Inject并解决依赖本身,而它并没有这样做。

我觉得我缺少一个非常基本的理解,为什么它不工作,但它只是还没有揭示自己。

对我做错了什么以及如何解决它有什么想法吗?

我在这里使用字段注入作为例子,我知道它不是建议的,而且在我的实际程序中不会使用它。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-19 16:02:34

Guice只向使用Injector.getInstance创建的类注入。您需要使用此方法创建控制器。可以通过在调用controllerFactory方法之前设置FXMLLoaderload来做到这一点:

代码语言:javascript
复制
Injector injector = Guice.createInjector(new BillingModule());

FXMLLoader loader = new FXMLLoader(getClass().getResource("addtest.fxml"));
loader.setControllerFactory(injector::getInstance);
Parent p = loader.load();
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49367232

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档