在Spring中使用JdbcTemplate访问数据库时出现NulllPointerException

时间:2011-11-19 11:02:25

标签: spring datasource jdbctemplate

我是一个Spring新手,我正在关注春季网站上的书籍和教程的一些例子,我无法让我的代码工作。

我正在尝试使用JdbcTemplate访问DataBase。这就是我的root-context.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"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://localhost:3306/db" />
    <property name="username" value="userr" />
    <property name="password" value="password" />
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.simple.SimpleJdbcTemplate">
    <constructor-arg ref="dataSource"/>
</bean>
<bean id="myDao" class="com.me.myproj.persistence.JdbcMyaDao">
    <property name="dataSource" ref="dataSource"/>
</bean>

这是我的JdbcMyDao(所有导入都没问题,我不会粘贴它们):

public class JdbcMyDao implements MyDao{

private JdbcTemplate jdbcTemplate;

public void setDataSource(DataSource dataSource) {
        this.jdbcTemplate = new JdbcTemplate(dataSource);
 }

public String getOpcionById(){
    String SQL_Q="select name from options where id=35";

    return (String)this.jdbcTemplate.queryForObject(SQL_Q, String.class);
}

}

最后,我的控制器:

@Controller
public class myController {

    @RequestMapping(value = "/show", method = RequestMethod.GET)
    public String show(Model model){

        JdbcMyDao daoP=new JdbcMyDao();
        String op=daoP.getOpcionById();

        model.addAttribute("op",op);
        return "show";
    }
}

好的,然后,show.jsp只打印返回字符串。

所以,这是一个非常简单的DataBase访问,但是在使用JdbcTemplate时(在函数getOpcionById中)我得到一个nullPointerException

我认为这是因为函数 setDataSource 从未运行过,我认为Spring是由IoC运行的,我试图把@Autowired放到jdbcTemplate属性我JdbcMyDao,但它也没有用。有人能告诉我Spring的步骤以及我应该采取哪些步骤?或者我应该做出哪些改变以及为什么?

2 个答案:

答案 0 :(得分:3)

您需要在控制器中自动装配DAO,而不是实例化它:

@Autowired
private JdbcMyDao dao;

使用new JdbcMyDao()实例化它时,它不受spring管理,并且不会注入其依赖项。

在我看来,这是依赖注入初学者最常见的错误。检查this post,看看它是否能让你更清楚。

答案 1 :(得分:2)

您的控制器正在实例化自己的JdbcMyDao并调用它,而不是使用您在root-context.xml中声明的bean。您需要将myDao bean注入控制器并调用它。

另外,你有没有理由定义一个JdbcTemplate bean,然后再对它做任何事情? DAO的setDataSource方法实例化了自己的JdbcTemplate(很好),所以没有理由声明bean。

我感觉你还没有完全理解依赖注入的概念 - 你似乎使用了直接实例化声明的bean,而不仅仅是后者。