Guice 空指针异常
Guice NullPointerExceptions
所以我是 Guice 的新手,每当我尝试使用注入的对象时,我都会不断收到 NullPointerException
s。
起初我以为是我的程序太复杂了,但我创建了一个非常非常简单的测试程序,但我仍然能理解它们。程序如下:
Main.java
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
public class BillingModule extends AbstractModule {
@Override
protected void configure() {
bind(Add.class).to(AddImpl.class);
}
}
Add interface
public interface Add {
int add(int a, int b);
}
AddImpl
public class AddImpl implements Add{
public int add(int a, int b) {
return a+b;
}
}
FXML Controller
public class AddTestController {
@Inject private Add add;
public void initialize(){}
@FXML
private void addTestButton(){
System.out.println(add.add(1,3));
}
}
FXML file
<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>
如您所见,这是一个非常简单的程序,但我似乎仍然无法让它工作。
我的目标是让 Add
被注入而不必调用 injector.getInstance(Add.class)
,而是看到 @Inject
并解决它本身的依赖关系,它没有这样做。
我觉得我对为什么它不起作用有一个非常基本的理解,但它还没有显露出来。
关于我做错了什么以及如何解决它有什么想法吗?
P.S。我在这里使用字段注入作为示例,我知道它不被建议并且在我的实际程序中不会使用它。
Guice 仅注入到使用 Injector.getInstance
创建的 类。您需要使用此方法创建控制器。您可以通过在调用 load
方法之前设置 FXMLLoader
的 controllerFactory
来做到这一点:
Injector injector = Guice.createInjector(new BillingModule());
FXMLLoader loader = new FXMLLoader(getClass().getResource("addtest.fxml"));
loader.setControllerFactory(injector::getInstance);
Parent p = loader.load();
所以我是 Guice 的新手,每当我尝试使用注入的对象时,我都会不断收到 NullPointerException
s。
起初我以为是我的程序太复杂了,但我创建了一个非常非常简单的测试程序,但我仍然能理解它们。程序如下:
Main.java
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
public class BillingModule extends AbstractModule {
@Override
protected void configure() {
bind(Add.class).to(AddImpl.class);
}
}
Add interface
public interface Add {
int add(int a, int b);
}
AddImpl
public class AddImpl implements Add{
public int add(int a, int b) {
return a+b;
}
}
FXML Controller
public class AddTestController {
@Inject private Add add;
public void initialize(){}
@FXML
private void addTestButton(){
System.out.println(add.add(1,3));
}
}
FXML file
<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>
如您所见,这是一个非常简单的程序,但我似乎仍然无法让它工作。
我的目标是让 Add
被注入而不必调用 injector.getInstance(Add.class)
,而是看到 @Inject
并解决它本身的依赖关系,它没有这样做。
我觉得我对为什么它不起作用有一个非常基本的理解,但它还没有显露出来。
关于我做错了什么以及如何解决它有什么想法吗?
P.S。我在这里使用字段注入作为示例,我知道它不被建议并且在我的实际程序中不会使用它。
Guice 仅注入到使用 Injector.getInstance
创建的 类。您需要使用此方法创建控制器。您可以通过在调用 load
方法之前设置 FXMLLoader
的 controllerFactory
来做到这一点:
Injector injector = Guice.createInjector(new BillingModule());
FXMLLoader loader = new FXMLLoader(getClass().getResource("addtest.fxml"));
loader.setControllerFactory(injector::getInstance);
Parent p = loader.load();