调用jdbcTemplate.queryForObject抛NullPointerException 库中存在数据如何解决
问题根因
你遇到的java.lang.NullPointerException核心原因是Dao类中的JdbcTemplate未被Spring容器注入,调用其方法时触发空指针。
你定义的private JdbcTemplate jdbcTemplate;没有添加依赖注入注解,Spring不会自动为该属性赋值,执行jdbcTemplate.queryForObject时自然会抛出空指针异常。
修复方案
1. 为JdbcTemplate添加依赖注入
推荐使用构造器注入(Spring 4.3及以上版本单构造器无需额外加@Autowired注解),修改后的Dao类代码如下:
@Transactional @Repository("daoUser") public class DaoUser{ private final JdbcTemplate jdbcTemplate; // 构造器注入JdbcTemplate public DaoUser(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } public UserLogin getUserlogin(final String userid) { UserLogin user = new UserLogin(); try { String sql = "SELECT usercode, userid, userpassword, userrole, username, useraccess FROM myschema.userlogin WHERE userid=?"; Object[] criteria = { userid }; user = jdbcTemplate.queryForObject(sql, BeanPropertyRowMapper.newInstance(UserLogin.class), criteria); } catch (Exception e) { System.out.println("Error in DaoUser.getUserlogin(final String userid) : " + e); } return user; } }
如果是旧版本Spring,也可以用字段注入的方式:
@Autowired private JdbcTemplate jdbcTemplate;
2. 额外检查项
- 确认Spring配置中已经注册了
JdbcTemplate的Bean,且关联的数据源配置正确,可正常连接到对应数据库 - 你当前的异常处理逻辑会在查询出错/无结果时返回初始化的空
UserLogin对象,后续调用该对象的属性时可能出现业务逻辑偏差,建议根据业务需求调整异常处理逻辑,比如无结果时向上层抛出业务异常,而非返回空对象
内容的提问来源于stack exchange,提问作者inquisitive
相关产品推荐
相关产品推荐

