嗨,这个问题让我很困惑,我花了两天的时间在网上搜索,发现了许多类似的问题,但不幸的是,这些问题已经解决了,对我来说不起作用。所以这是我第一次问问题,因为我没有其他地方可以求助。我的背景我是自学成才的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;
}
我真的很想得到一些关于这个问题的指导,因为我已经搜索了网络,尝试了不同的解决方案,但无论我使用什么,我似乎都无法获得我的数据,即使它是使用命令行提示符返回的。
这非常简单。在第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-工厂客户端