2017-06-07 45 views
0

所以我尝试了许多修改,但是我不确定什么是错误的代码。这是我在春季的第一个项目。我正在用我的sql方法给出一个空指针异常。Spring中的JDBC模板给出异常

我JdbcDAO.java

import javax.sql.DataSource; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.Map; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.context.annotation.Bean; 
import org.springframework.jdbc.core.JdbcTemplate; 
import org.springframework.jdbc.core.support.JdbcDaoSupport; 
import org.springframework.jdbc.datasource.*; 
import org.springframework.stereotype.Repository; 

/** 
* Created by Albedo on 6/6/2017. 
*/ 

@Repository("reviewDAO") 
public class JdbcReviewDAO { 
    private DataSource dataSource; 
    private JdbcTemplate jdbcTemplate; 

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

    @Bean 
    public JdbcTemplate getTemplate(){ 
     return jdbcTemplate; 
    } 

    public void setJdbcTemplate(JdbcTemplate jdbcTemplate){ 
     this.jdbcTemplate = jdbcTemplate; 
    } 

    // sql methods go here 
} 

我的弹簧Datasource.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-2.5.xsd"> 

    <bean id="dataSource" 
      class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 

     <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
     <property name="url" value="jdbc:mysql://127.0.0.1:3306/" /> 
     <property name="username" value="root" /> 
     <property name="password" value="admin" /> 
       </bean> 
<bean id="reviewDAO" class="com.JdbcReviewDAO"> 
    <property name="dataSource" ref="dataSource" /> 
</bean> 
</beans> 

我application.java:

import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 
import org.springframework.context.ApplicationContext; 
import org.springframework.context.support.ClassPathXmlApplicationContext; 

@SpringBootApplication 
public class Application { 

    public static void main(String[] args) { 
     //ApplicationContext context = 
     //  new ClassPathXmlApplicationContext("Spring-Review.xml"); 
     JdbcReviewDAO reviewDAO = new JdbcReviewDAO(); 
     reviewDAO.grabFirstPost(1); 
     SpringApplication.run(Application.class, args); 
    } 
} 

(我已删除软件包名 - 放心,他们在项目中正确定义,以及用SQL方法去除冗余,让我知道是否应该包含它们如果你怀疑他们是这个问题)。我认为这更多的是一个'基础设施'问题(原谅我的无知,仍然是一个noobie)而不是代码。任何人有想法?

错误日志:\

Exception in thread "main" java.lang.NullPointerException 
    at JdbcDAO.grabFirstPost(JdbcDAO.java:63) 
    at Application.main(Application.java:15) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147) 

Process finished with exit code 1 

方法*,使该错误:

public String grabFirstPost(int id) { 
    String sql = "SELECT * FROM post WHERE postid ='" + id + "'"; 

    String postContent = (String)jdbcTemplate.queryForObject(sql, new Object[] {id}, String.class); 
    return postContent; 
} 
+0

请显示错误日志以获取帮助 –

+0

已添加,尽管我不知道它有多大帮助。 –

+0

错误发生在JdbcDAO.java的第63行。那条线上有什么? – meriton

回答

1

您的主要方法是错误的。您不是加载应用程序上下文,而是直接创建您的DAO。也许你需要更改为:

ApplicationContext context = 
     new ClassPathXmlApplicationContext("Spring-Review.xml"); 
JdbcReviewDAO reviewDAO = context.getBean("reviewDAO"); 
+0

这给了我一个错误,说一个对象不能转换成JDBC reviewDAO。 编辑:试着把它作为一个JDBC reviewDAO转换,我得到了无数的错误,因此值得一提。 –

+0

这个问题已经回答。你可以用你的新错误更新它,或者创建另一个问题 – tsolakp

+0

如果它给出错误,它可以被称为答案吗? 我只是不幸不得不在我自己身上看到这一个。 –

0

貌似变量jdbcTemplate包含null。最可能的原因是Spring没有注入它,因为setter没有注释@Autowired

+0

它在'setDataSource'中初始化。 – tsolakp

+0

哦对。另一个没有注释的制定者让我困惑:-)。尽管如此,仍然可能需要检查setter是否被实际调用。 – meriton

+0

我如何检查它是否被调用? –