2012-07-17 34 views
0

嗨即時通訊新的Spring,MVC和JdBC支持。 我想能夠連接到一個MySQL數據庫..但是當我運行我的網絡時,它返回null。下面的代碼我相信應該很容易,我在這裏錯過了什麼?感謝所有回覆Spring 3的結果集MVC和JDBC返回null

下面是我的錯誤,當嘗試查詢網址

java.lang.NullPointerException 
com.simple.myacc.dao.JdbcContactDao.findAll(JdbcContactDao.java:55) 
com.simple.myacc.ContactController.getAll(ContactController.java:44) 

我spring.xml

..... 

<context:component-scan base-package="com.simple.myacc" /> 

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
    <property name="prefix"> 
     <value>/WEB-INF/jsp/</value> 
    </property> 
    <property name="suffix"> 
     <value>.jsp</value> 
    </property> 
</bean> 

<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/webcontact" /> 
    <property name="username" value="root" /> 
    <property name="password" value="password" /> 
</bean> 

<bean id="jdbcContactDao" class="com.simple.myacc.dao.JdbcContactDao"> 
    <property name="dataSource" ref="dataSource" /> 
</bean> 

我JdbcContactDao

public class JdbcContactDao { 
protected static Logger logger = Logger.getLogger("service"); 
private DataSource dataSource; 
private JdbcTemplate jdbcTemplate; 

public JdbcContactDao() { 

} 

public List<Contact> findAll() { 

    String sql = "select * from contact"; 
    List<Contact> contacts = new ArrayList<Contact>(); 
    List<Map<String, Object>> rows = jdbcTemplate.queryForList(sql); 
    for (Map rs : rows) { 
     Contact contact = new Contact(); 
     contact.setId((Integer) rs.get("id")); 
     contact.setFirstname((String) rs.get("firstname")); 
     contact.setLastname((String) rs.get("lastname")); 
     contact.setEmail((String) rs.get("email")); 
     contact.setPhone((String) rs.get("phone")); 
     contacts.add(contact); 
    } 
    return contacts; 
} 

@Resource(name = "dataSource") 
public void setDataSource(DataSource dataSource) { 
    this.dataSource = dataSource; 

} } 

我的控制器,它的某些部分

@RequestMapping(value="/contact/list2",method = RequestMethod.GET) 
public String getAll(ModelMap model) { 
    dao=new JdbcContactDao(); 
    List<Contact> contacts = dao.findAll(); 

    // Attach persons to the Model 
    model.addAttribute("contacts", contacts); 


    return "contact.list"; 

} 

這是說,NULL

 List<Map<String, Object>> rows = jdbcTemplate.queryForList(sql); 
+0

JdbcContactDao.java的第55行是什麼? – digitaljoel 2012-07-17 15:24:11

+0

已更新.. \t \t List > rows = jdbcTemplate.queryForList(sql); – pakcikkantin 2012-07-17 15:24:34

回答

0

你有你的數據源和您的JdbcContactDAO豆在配置文件中配置。 所以用同樣的方法你需要將jdbcContactDAO bean注入你的Controller。

<bean id="myController" class="mypath.MyController"> 
<property name="dao" ref="jdbcContactDao"/> 
</bean> 

而在您的控制器....

public JdbcContactDao dao; 

@Resource(name="dao") 
public void setDao(JdbcContactDao dao){ 
    this.dao = dao; 
} 


@RequestMapping(value="/contact/list2",method = RequestMethod.GET) 
public String getAll(ModelMap model) { 

    List<Contact> contacts = dao.findAll(); 

    // Attach persons to the Model 
    model.addAttribute("contacts", contacts); 


    return "contact.list"; 

} 
+0

是的,這個幫助。缺少的部分是@Resource(name =「dao」)/或將bean指向我的控制器..非常感謝你rprab。和digitaljoel和其他..非常有幫助 – pakcikkantin 2012-07-17 16:16:20

0

我猜線JdbcContactDao的55行這一個List<Map<String, Object>> rows = jdbcTemplate.queryForList(sql);你聲明的JdbcTemplate ,但從來沒有給它一個價值,它也沒有注射注射,所以它總是會爲空。所以,當你嘗試使用它時,你會得到NPE。

+0

嗨digitaljoe,感謝非常快的答覆,我試過public void setDataSource(DataSource dataSource){ \t \t this.dataSource = dataSource; \t \t this.jdbcTemplate = new JdbcTemplate(dataSource); \t}但仍然返回null – pakcikkantin 2012-07-17 15:32:01

1

使用JdbcTemplate類的一個常見習慣用法是在Spring配置文件中配置一個DataSource,然後將該共享DataSource bean依賴注入到您的DAO類中; JdbcTemplate是在DataSource的setter中創建的。 私人JdbcTemplate jdbcTemplate;

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

你可以閱讀更多關於這個here

您的代碼看起來像這樣

<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/webcontact" /> 
<property name="username" value="root" /> 
<property name="password" value="password" /> 

你不需要這個

<bean id="jdbcContactDao" class="com.simple.myacc.dao.JdbcContactDao"> 
<property name="dataSource" ref="dataSource" /> 

而是做到這一點

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

和註釋與@Repository 您JdbcContactDao類我認爲應該工作

0

有類似的問題被連接到用java/JDBC 字符串SQL =舊錶 「選擇從表USER_NAME」

jdbc.queryForList(sql); 

queryReturnList = jdbc.queryForList(sql); 

    for (Map mp : queryReturnList){   
     String userName = (String)mp.get("user_name");   
} 

的userName總是零。通過查看返回值的映射,發現地圖不是使用user_name,而是在「用戶名」表上設置的標籤必須具有DBA的修復。希望這可以幫助