2012-07-17 30 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的修复。希望这可以帮助