如何在Service类中通过@Autowired注入使用JpaRepository
Spring Boot Service层JPA Repository注入为null问题排查
前置排查说明
已查阅多篇相关技术问答与教程,包含平台内《Spring boot MVC - Unable to Autowire Repository in the service class》《Why can't @Autowired a JPA repository - Spring boot + JPA》《JpaRepository getting Null at service class》三篇相关帖子,以及@Autowired字段注入为null的相关教程,尝试其中所有解决方案均未生效。
现有代码结构
Service接口定义
@Service public interface DayTradeService { public List<DayTrade> getDayTrades(List<NotaDeCorretagem> corretagens); }
Service实现类定义
public class DayTradeServiceImpl implements DayTradeService { @Autowired private DayTradeRepository dayTradeRepository; @Override public List<DayTrade> getDayTrades(List<NotaDeCorretagem> corretagens) { // 业务逻辑代码,部分逻辑需要调用dayTradeRepository方法 } }
Repository层定义
@Repository public interface DayTradeRepository extends JpaRepository<DayTrade, Integer> {}
异常表现
- 标注
@Controller注解的DayTradeController中,通过@Autowired注入的dayTradeRepository可以正常调用 - Service类中注入的
dayTradeRepository始终为null,调用方法时抛出如下错误:
Cannot invoke "meca.irpf.Repositories.DayTradeRepository.getDayTrades()" because "this.dayTradeRepository" is null
问题根因与修复方案
注意:Spring的@Service等构造型注解需要标注在实现类上,而非接口上
- 将
@Service注解从DayTradeService接口移除,添加到DayTradeServiceImpl实现类上,确保Spring容器能扫描到该Service实现类并生成托管Bean - Controller层禁止手动通过
new DayTradeServiceImpl()的方式创建Service实例,必须通过@Autowired注入DayTradeService类型的托管Bean使用
手动new创建的对象脱离Spring容器管理,对象内部标记
@Autowired的属性不会完成注入,这是本次依赖为null的核心原因
完成以上修正后,Service层的Repository注入恢复正常,问题解决。
内容的提问来源于stack exchange,提问作者Paulo
相关产品推荐
相关产品推荐

