如何在不同的类中使用Simple JdbcDaoImpl - Spring

时间:2014-07-22 14:20:06

标签: java spring hibernate javafx

当我尝试访问并使用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

为简单起见,在这种情况下,让我们将一些文本从数据库打印到控制台。我上面的代码出了什么问题?谢谢大家。

1 个答案:

答案 0 :(得分:0)

为了向其合作者注入Spring bean,它必须由Spring管理。 HomeController实际上是由FXML管理的,它对Spring注释(@Autowired)一无所知,并且会忽略它们。更糟糕的是,假设HomeController位于wakiliproject包(或其子包之一)下,Spring确实会创建HomeController的另一个实例@Autowired注入的东西,但 @FXML的东西。

根据加载控制器的方式,您可以将从Spring 中检索到的HomeController 的实例设置为.fxml视图的控制器。所以:

  1. 确保Spring实际看到HomeController(这会为您提供HomeController的实例,并注入@Autowired个内容。

  2. 将FXML文档加载为:

    HomeController homeController = springContext.getBean(HomeController.class);
    FXMLLoader fxmlLoader = new FXMLLoader(xxx.getResource("HomeController.fxml"));
    fxmlLoader.setController(homeController);
    try {
        fxmlLoader.load();
    } catch...
    

    以上几乎是伪代码,必要时进行调整!

    如果load()成功,控制器的@FXML字段也将被填充,并且将调用其初始化方法。

  3. 查看this question非常有用的答案。