无法自动装配NamedParameterJdbcTemplate:需'dataSource'或'jdbcTemplate'问题排查
你遇到的java.lang.IllegalArgumentException: 'dataSource' or 'jdbcTemplate' is required错误,根源在于你的StockDaoImpl类继承了JdbcDaoSupport,但没有给这个父类注入它必需的dataSource或jdbcTemplate。
JdbcDaoSupport是Spring提供的抽象类,用于简化JDBC操作,但它有硬性要求:必须通过setDataSource或setJdbcTemplate方法注入对应依赖,否则初始化Bean时会抛出参数缺失的异常。你当前代码仅注入了NamedParameterJdbcTemplate,完全未处理父类的依赖需求,因此触发了报错。
解决方案(二选一即可)
方案1:移除不必要的继承关系
如果你的StockDaoImpl并没有使用JdbcDaoSupport提供的任何方法(比如getJdbcTemplate()),只是独立使用NamedParameterJdbcTemplate操作数据库,完全可以去掉对JdbcDaoSupport的继承:
@Repository public class StockDaoImpl implements StockDao { // 移除extends JdbcDaoSupport @Autowired private NamedParameterJdbcTemplate namedParameterJdbcTemplate; // 业务方法保持不变... }
方案2:给JdbcDaoSupport注入依赖
如果你确实需要使用JdbcDaoSupport的功能,需要给它注入dataSource或jdbcTemplate,可以通过@Autowired实现:
@Repository public class StockDaoImpl extends JdbcDaoSupport implements StockDao { @Autowired private NamedParameterJdbcTemplate namedParameterJdbcTemplate; // 注入dataSource给父类 @Autowired @Override public void setDataSource(DataSource dataSource) { super.setDataSource(dataSource); } // 业务方法保持不变... }
或者更推荐构造方法注入(符合依赖注入最佳实践):
@Repository public class StockDaoImpl extends JdbcDaoSupport implements StockDao { private final NamedParameterJdbcTemplate namedParameterJdbcTemplate; @Autowired public StockDaoImpl(DataSource dataSource, NamedParameterJdbcTemplate namedParameterJdbcTemplate) { super.setDataSource(dataSource); this.namedParameterJdbcTemplate = namedParameterJdbcTemplate; } // 业务方法保持不变... }
额外注意点
你的配置文件里还有一个小问题:事务管理器ID与tx:annotation-driven指定的不一致。你配置的事务管理器ID是transactionManager,但注解驱动里写的是myTransactionManager,这会导致@Transactional注解无法生效,建议修正为:
<tx:annotation-driven transaction-manager="transactionManager" />
内容的提问来源于stack exchange,提问作者pheromix

