JdbcTemplate.update()中的NullPointerException

时间:2015-02-23 11:48:46

标签: postgresql maven spring-jdbc

我刚开始使用PostgeSQL弹出jdbc并在JdbcTemplate.update()的DAO类中获取NullPointerException。内容如下:

的pom.xml

<!-- Spring JDBC Support -->
     <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>4.0.2.RELEASE</version>
    </dependency>
   <!-- postgreSQL Driver -->          
    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>9.4-1200-jdbc41</version>
    </dependency>

servlet的context.xml中

<!-- declare datasource bean -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="org.postgresql.Driver" />
    <property name="url" value="jdbc:postgresql://localhost:5432/notesHero" />
    <property name="username" value="postgres" />
    <property name="password" value="postgres" />
</bean>

DAOImpl类

  @Component
 public class AdvertiseDAOImpl implements AdvertiseDAO 
  {

private JdbcTemplate template;
@Autowired
private DataSource dataSource;

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

    /*public AdvertiseDAOImpl(DataSource dataSource) {
        template = new JdbcTemplate(dataSource);
    }*/

@Override
public void save(Advertise ad) {
    // TODO Auto-generated method stub
    String insertQry = "INSERT INTO ad_master (name, email_id) values (?,?)";
    System.out.println(ad.getName() + ad.getEmail());
    template.update(insertQry, ad.getName(), ad.getEmail());
}

@Override
public void delete(long postId) {
    // TODO Auto-generated method stub

}

@Override
public Advertise get(long postId) {
    // TODO Auto-generated method stub
    return null;
}

}

在这方面的任何帮助将受到高度赞赏..

2 个答案:

答案 0 :(得分:1)

问题在这里:

@Autowired
private DataSource dataSource;

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

您在字段上进行自动装配,因此您的setter方法永远不会被调用,因此您的模板变量保持未初始化(或默认为null)。

因此,而不是自动装配字段autowire setter方法。

答案 1 :(得分:0)

问题可能是Spring没有调用方法

public void setDataSource(DataSource dataSource)

接线时

@Autowired
private DataSource dataSource; 

通过将此方法添加到类AdvertiseDAOImpl

,Spring完成自动装配DataSource后,可以初始化JdbcTemplate
@PostConstruct
public void initialize() {
    template = new JdbcTemplate(dataSource);
}

或者,您可以通过将@Autowired注释添加到private JdbcTemplate template;字段来定义JdbcTemplate bean并使其自动装配。