当前位置: 首页 > 知识库问答 >
问题:

Spring framework JDBCTemplate NullPointerException

萧嘉茂
2023-03-14

嗨,这个问题让我很困惑,我花了两天的时间在网上搜索,发现了许多类似的问题,但不幸的是,这些问题已经解决了,对我来说不起作用。所以这是我第一次问问题,因为我没有其他地方可以求助。我的背景我是自学成才的Java初学者,开始学习Spring框架这是我在线程“main”Java中的错误异常。ie.cit.cloud上的lang.NullPointerException。jdbctemplate。道。InstitutionJdbcTemplate。getInstitution(InstitutionJdbcTemplate.java:58)位于ie.cit.cloud。应用程序。main(应用程序java:134)

main中有问题的代码行已被注释

public class App{
    private static ApplicationContext appContext;

     public static void main(String[] args){

        appContext = new ClassPathXmlApplicationContext("configuration.xml");

        InstitutionJdbcTemplate ins = new InstitutionJdbcTemplate();

        ***//App.java:134 below***
        List<InstitutionJdbcTemplate> inst = (List<InstitutionJdbcTemplate>) ins.getInstitution("_CIT");
    }
}

 The offending line of code in InstitutionJdbcTemplate is also commented below
public class InstitutionJdbcTemplate extends Institution implements InstitutionDAO {

    private DataSource dataSource;
    private JdbcTemplate jdbcTemplateObject;

@Override
public void setDataSource(DataSource dataSource) {
    this.dataSource = dataSource;
    this.jdbcTemplateObject = new JdbcTemplate(dataSource);

}

@Override
public void createInstitution(String instId, String name, String address) {
    String SQL = "insert into Institution (inst_id, name, address) values (?, ?, ?)";
    jdbcTemplateObject.update(SQL, new Object[] { instId, name, address});
    System.out.println("Created Record Name = " + instId + " Name = " + name);
    return;

}

@Override
public void deleteInstitution(String instId) {
    String SQL = "delete from Institution where inst_id = ?";
    jdbcTemplateObject.update(SQL, new Object[] {instId});
    System.out.println("Deleted Record with ID = " + instId );
    return;

}

@Override
public void updateInstitution(String name,String address,String instId) {
    String SQL = "UPDATE institution SET name = ?, address = ? WHERE inst_id = ?";
    jdbcTemplateObject.update(SQL, name, address,instId);
    System.out.println("Updated Record with ID = " + instId );
    return;

}

@Override
public Institution getInstitution(String inst) {
        String SQL = "select *  from Institution where inst_id= ?";
    ***//line 58 below***
    Institution instCIT = (Institution) jdbcTemplateObject.queryForObject(SQL, 
                    new Object[]{inst}, new InstitutionMapper());
    return instCIT;


}

我不明白为什么在前面的两个方法(createInstitution、deleteInstitution)中会给我一个NullPointerException,所有这些方法都可以很好地插入删除数据,没有问题。

我的Institute tionMapper类如下

public class InstitutionMapper implements RowMapper<Institution>{

@Override
public Institution mapRow(ResultSet rs, int rowNum) throws SQLException {
    Institution inst = new Institution();
    String str= rs.getString("inst_id");
    inst.setInsId(InstitutionId.valueOf(str));
    inst.setName(rs.getString("name"));
    inst.setAddress(rs.getString("address"));
    return inst;
}

我真的很想得到一些关于这个问题的指导,因为我已经搜索了网络,尝试了不同的解决方案,但无论我使用什么,我似乎都无法获得我的数据,即使它是使用命令行提示符返回的。

共有1个答案

姚麒
2023-03-14

这非常简单。在第58行,您正在调用jdbcTemplateObject上的方法。

那么,这个变量在哪里初始化为null以外的东西呢?

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

是否调用过此方法?否。您的main执行以下操作:

InstitutionJdbcTemplate ins = new InstitutionJdbcTemplate();
List<InstitutionJdbcTemplate> inst = (List<InstitutionJdbcTemplate>) ins.getInstitution("_CIT");

因此,由于从未对新InstitutionJdbcTemplate对象调用setDataSource(),因此该变量为null,对null调用方法会引发NPE。

您的目的可能是让Spring调用setDataSource()方法。只有当Spring实例化InstitutionJdbcTemplate而不是您时,这才可能实现。通过执行new InstitutionJdbcTemplate(),您完全忽略了Spring。你所做的一切就是创建一个对象,Spring无法知道这一点。因此,假设您在Spring配置中定义了InstitutionJdbcTemplate类型的bean,那么您需要做的是从Spring上下文中获取这个bean:

InstitutionJdbcTemplate ins = appContext.getBean(InstitutionJdbcTemplate.class);

阅读http://docs.spring.io/spring/docs/4.1.x/spring-framework-reference/htmlsingle/#beans-工厂客户端

 类似资料:

相关问答

相关文章

相关阅读