2011-11-19 22 views
1

用的JdbcTemplate訪問數據庫時,我是一個新手春天,我在下面的春天從網站書籍和教程一些例子,我不能讓我的代碼工作。NulllPointerException春

我試圖訪問使用JdbcTemplate的一個數據庫。這是我的根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(全部進口都OK,我不會將它們粘貼):

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只是打印返回字符串。

所以,這是一個數據庫,一個非常簡單的訪問,但使用的JdbcTemplate(在功能getOpcionById)

我想這是因爲功能的setDataSource永遠不會拼命地跑,當我得到一個NullPointerException,我以爲春天奔跑它通過IoC,我試圖把@Autowired放入jdbcTemplate屬性i JdbcMyDao中,但它也不起作用。有人能告訴我Spring的步驟和我應該採取的步驟嗎?或者我應該做什麼改變,爲什麼?

回答

2

你的控制器正在實例化它自己的JdbcMyDao並且調用它,而不是使用你在root-context.xml中聲明的bean。您需要將myDao bean注入控制器並調用它。

此外,有沒有你定義一個JdbcTemplate豆,然後沒有做任何事的理由嗎? DAO的setDataSource方法正在實例化它自己的JdbcTemplate(這很好),所以沒有理由聲明一個bean。

我有一種感覺,你還沒有完全理解依賴注入的概念 - 你似乎使用了直接實例化聲明的bean,而不僅僅是後者。

+0

我想我現在理解得更好。謝謝! – de3

3

你需要自動裝配的DAO在你的控制器,而不是將其實例化:

@Autowired 
private JdbcMyDao dao; 

當你與new JdbcMyDao()實例化它,它不是由Spring管理,它的依賴不會被注入。

在我看來,這是依賴注入初學者最常見的錯誤。檢查this post,看看它是否讓你的事情更清晰。

+0

不錯的貼子!非常感謝 – de3