Spring自动注入Repository到Service时抛出NoSuchBeanDefinitionException
解决Spring中Repository无法注入Service的NoSuchBeanDefinitionException问题
最近我遇到了一个头疼的Spring依赖注入问题——尝试把MktPlace2PedidoRepository自动注入到被Controller调用的MktPlace2PedidoService中时,一直报找不到Bean的错误,但其他用同样方式注入的Repository却完全正常运行。
报错信息
Error creating bean with name 'mktPlace2PedidoService' defined in VFS resource ["/home/davidgarcia/wildfly-11.0.0.Final/standalone/deployments/issuer.war/WEB-INF/classes/br/com/sinergico/service/mktplace2/MktPlace2PedidoService.class"]: Unsatisfied dependency expressed through constructor argument with index 0 of type [br.com.sinergico.repository.mktplace2.MktPlace2PedidoRepository]: No qualifying bean of type [br.com.sinergico.repository.mktplace2.MktPlace2PedidoRepository] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [br.com.sinergico.repository.mktplace2.MktPlace2PedidoRepository] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}
相关代码片段
- Service层代码(构造方法注入Repository)
package br.com.sinergico.service.mktplace2; @Service public class MktPlace2PedidoService extends GenericService<MktPlace2Pedido, Long> { private MktPlace2PedidoRepository repository; @Autowired public MktPlace2PedidoService(MktPlace2PedidoRepository repository) { super(repository); this.repository = repository; } // 其他业务方法 }
- Repository接口代码
package br.com.sinergico.repository.mktplace2; public interface MktPlace2PedidoRepository extends JpaRepository<MktPlace2Pedido, Long> { // 自定义查询方法 }
- Entity实体类代码
package br.com.entity.mktplace2; @Entity @Table(name="pedido", schema = "marketplace") @SequenceGenerator(name="hibernate_sequence", sequenceName="marketplace.hibernate_sequence",initialValue=1, allocationSize=1) public class MktPlace2Pedido implements Serializable{ private static final long serialVersionUID = 45381343130121532L; @Id @Column(name="id") @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "hibernate_sequence") private Long id; // 其他字段及getter/setter }
排查过程
一开始我以为是Repository没被Spring识别,特意给MktPlace2PedidoRepository加了@Repository注解,但问题依然存在。对比其他正常工作的Repository,代码结构和注入方式完全一致,这让我困惑了好久。
解决方法
最后才发现问题出在Spring的JPA配置上——@EnableJpaRepositories注解的basePackages属性里漏掉了br.com.sinergico.repository.mktplace2这个包路径!Spring没办法扫描到这个包下的Repository接口,自然无法生成对应的Bean实例。修改后的配置如下:
@EnableJpaRepositories(basePackages = { // 其他已配置的包路径 ,"br.com.sinergico.repository.mktplace2" // 其他已配置的包路径 })
加上这个包路径后,Spring就能正常扫描并创建MktPlace2PedidoRepository的Bean,依赖注入也恢复正常了。
内容的提问来源于stack exchange,提问作者David Silva
相关产品推荐
相关产品推荐

