我正在尝试使用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上已有的其他空指针弹出问题的解决方案:
答案 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;