零指针异常Spring在JavaFX中自动装配

时间:2018-04-11 08:42:41

标签: java spring javafx

我正在尝试使用Autowired注释将我的datamodel类自动装入各种控制器类,并且我一直得到一个空指针异常,我想保持我的配置XML,并尽可能避免使用应用程序上下文实现。代码片段和spring-config文件位于

之下

弹簧配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-2.5.xsd">

    <context:annotation-config/>

    <bean id="datamodel" class="com.filemanager.datamodel.DataModel" autowire="byType"/>

</beans>

数据模型类

public class DataModel {

    private ObservableList<Song> windowDisplaySongs;

    public void test() {
        System.out.println("Hey, this is working");
    }

    public ObservableList<Song> getWindowDisplaySongs() {
        return windowDisplaySongs;
    }
    public void setWindowDisplaySongs(ObservableList<Song> windowDisplaySongs) {
        this.windowDisplaySongs = windowDisplaySongs;
    }
}

依赖于模型的控制器

public class FileBrowserController implements Initializable {

    @Autowired
    DataModel dataModel;

    @Override
    public void initialize(URL location, ResourceBundle resources) {

        dataModel.test();
    }
}

我尝试过的事情

  • 在模型类上方使用组件注释,在模型和控制器类上方

  • 使用控制器类上方的控制器注释

  • 重命名datamodel引用以匹配spring-config文件中的名称

  • 使用限定符注释指定datamodel引用应与spring配置文件中的名称匹配。

  • 在init方法以外的方法中使用模型引用

  • 删除autowire =&#34; byType&#34;来自配置文件

  • 使用下面的代码在main方法中创建应用程序上下文,我能够使用getBean()方法,但我想使用autowired自动注入依赖项而不必调用每次都是getBean()方法。

    ApplicationContext ctx = new ClassPathXmlApplicationContext("config/spring-config.xml");
    
  • 遵循Stackoverflow上已有的其他空指针弹出问题的解决方案:

1 个答案:

答案 0 :(得分:1)

FileBrowserController类应注释为@Controller,因此Spring知道它应该在那里注入属性。如果您有一个具有该属性名称的bean,也@Autowiring没有限定符检查。在你的情况下:

@Autowired
DataModel dataModel;

检查具有id dataModel的bean,但是您的bean使用不同的名称定义:

<bean id="datamodel"...

发现差异? :)您可以更改bean ID,也可以使用Qualifier使其更清晰

@Autowired
@Qualifier("datamodel")
DataModel dataModel;