虽然解决了问题,但不清楚到底怎么回事,请有经验朋友支援下。关于Spring @Autowired 与 JpaRepository冲突问题。

myepoch 2015-12-18 06:48:22
您看完描述后,请一定注意我在文中最后的注意事项。

代码仅仅有一个controller类,一个服务接口、一个服务类实现、一个仓库接口、一个仓库实现,一个实体域,共六个JAVA类。

仓库接口类:
public interface ProjectRepository extends JpaRepository<ProjectDomain, Long>, 
JpaSpecificationExecutor<ProjectDomain> {

}



仓库实现类
@Repository
public class ProjectRepositoryImpl implements ProjectRepository{

}



服务类
@Service
public class ProjectServiceImpl implements ProjectService {

@Autowired
private ProjectRepository projectRepository;
//private ProjectRepository repository;

}



一、服务类如下定义: private ProjectRepository projectRepository; 没有任何问题。(变量名称与类名称一致,仅仅首字符小写)

二、去掉仓库实现类,仅仅留下仓库接口类,那么以下在项目启动时没有任何问题
服务类如下定义: private ProjectRepository repository; (变量名称与类名称不一致)

三、如果同时保留仓库接口和仓库实现类
在服务类中做如下定义: private ProjectRepository repository;(变量名称与类名称不一致)

报错
Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [com.neusoft.ehrss.template.app.projects.domain.notice.ProjectRepository] is defined:expected single matching bean but found 2: projectRepositoryImpl,projectRepository
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1054)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:942)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:533)
... 31 more



注意1:到网上查找了资料,大部分说是BEAN类型不只一个,这我可以理解也明白。但问题的关键是,我仅仅一个仓库接口和一个仓库实现类,不存在多个实现类 现实一个接口的情况。
注意2:如果我不在仓库接口中继承 JpaRepository ,那么以上的报错问题就不存在。
所以,这问题真的很奇怪,我一直没清楚到底怎么回事,虽然是解决了问题。但希望有经验的朋友帮忙看看问题出在哪里?

...全文
851 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
CC啊 2018-02-05
  • 打赏
  • 举报
回复
你自定义的接口A一旦继承了JpaRepository,那么A的实现类就不需要再加注解@Repository 。而你加上后相当于注入两次相同的bean。所以,错误信息是ununique…。而且要注意A的实现类命名规则应该是A的名称+Impl。如A:UserRepository,那么实现类应该叫UserRepositoryImpl。
myepoch 2015-12-24
  • 打赏
  • 举报
回复
有实验成功的吗
lgmsyy 2015-12-21
  • 打赏
  • 举报
回复
我也遇到类似的问题,也想知道怎么回事
myepoch 2015-12-19
  • 打赏
  • 举报
回复
有没有人能帮忙解答下为什么,十分感谢。
myepoch 2015-12-19
  • 打赏
  • 举报
回复
这个是我在项目中遇到的问题,平台基于Spring boot构建。
myepoch 2015-12-18
  • 打赏
  • 举报
回复
引用 1 楼 my_God_sky 的回复:
1. JPA是orm的规范,你实现了jpa就意味着遵循规范。 2. 实现类和接口,你的实现类实现接口,遵循了jpa的规范,那么spring的DI就只会找接口。(其实你的第二条应该只是启动的时候没问题,在项目中调用的时候会报错;应该是无法注入的错误)。 看看这个
在项目项目中没任何问题的
_南天北落 2015-12-18
  • 打赏
  • 举报
回复
1. JPA是orm的规范,你实现了jpa就意味着遵循规范。 2. 实现类和接口,你的实现类实现接口,遵循了jpa的规范,那么spring的DI就只会找接口。(其实你的第二条应该只是启动的时候没问题,在项目中调用的时候会报错;应该是无法注入的错误)。 看看这个

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧