当我尝试访问并使用SimpleJdbcDaoSupport
时,我得到一个空指针。这就是我的工作方式:
在主要班级
@Override
public void start(final Stage primaryStage) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("spring.xml");
SimpleJdbcDaoImpl dao = ctx.getBean("simpleJdbcDaoImpl", SimpleJdbcDaoImpl.class);
在其他一些阶段控制器类
中public class HomeController implements Initializable {
@Autowired
private SimpleJdbcDaoImpl simpleJdbcDaoImpl;
// Initializes the controller class.
@Override
public void initialize(URL url, ResourceBundle rb) {
// Stage and the rest called
}
@FXML
public void showNewCalendarStage() throws Exception {
System.out.println(simpleJdbcDaoImpl.getCircleCount());
}
SimpleJdbcDaoSupport
班
import org.springframework.jdbc.core.simple.SimpleJdbcDaoSupport;
public class SimpleJdbcDaoImpl extends SimpleJdbcDaoSupport {
public int getCircleCount() {
String sql = "SELECT COUNT(*) FROM KIWI_TABLE";
return this.getJdbcTemplate().queryForInt(sql);
}
}
spring.xml
<?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.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="org.h2.Driver"/>
<property name="url" value="jdbc:h2:file:C:/WAKILI/WAKILIdb"/>
<property name="username" value="sa"/>
<property name="password" value=""/>
</bean>
<bean id="simpleJdbcDaoImpl" class="wakiliproject.dao.SimpleJdbcDaoImpl">
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="configLocation">
<value>
classpath:/hibernate.cfg.xml
</value>
</property>
<property name="hibernateProperties">
<props>
<prop key="dialect">org.hibernate.dialect.H2Dialect</prop>
</props>
</property>
</bean>
<context:annotation-config/>
<context:component-scan base-package="wakiliproject"/>
</beans>
错误:
Caused by: java.lang.NullPointerException
at HomeController.showNewCalendarStage(HomeController.java:283)
... 42 more
我试图自学Spring,并希望,例如,使用从数据库中检索到的文本在另一个Controller类(主类除外)中填充Label
。
为简单起见,在这种情况下,让我们将一些文本从数据库打印到控制台。我上面的代码出了什么问题?谢谢大家。
答案 0 :(得分:0)
为了向其合作者注入Spring bean,它必须由Spring管理。 HomeController
实际上是由FXML管理的,它对Spring注释(@Autowired
)一无所知,并且会忽略它们。更糟糕的是,假设HomeController
位于wakiliproject
包(或其子包之一)下,Spring确实会创建HomeController
的另一个实例@Autowired
注入的东西,但不 @FXML
的东西。
根据加载控制器的方式,您可以将从Spring 中检索到的HomeController
的实例设置为.fxml视图的控制器。所以:
确保Spring实际看到HomeController
(这会为您提供HomeController
的实例,并注入@Autowired
个内容。
将FXML文档加载为:
HomeController homeController = springContext.getBean(HomeController.class);
FXMLLoader fxmlLoader = new FXMLLoader(xxx.getResource("HomeController.fxml"));
fxmlLoader.setController(homeController);
try {
fxmlLoader.load();
} catch...
以上几乎是伪代码,必要时进行调整!
如果load()
成功,控制器的@FXML
字段也将被填充,并且将调用其初始化方法。
查看this question非常有用的答案。