I’ve come across an issue recently in a project where I was using Spring Data JPA. I had a repository defined like this:
@Repository public interface QuestionCategoryRepository extends JpaRepository<QuestionCategory, Long> { }
I also had a service class where I injected this repository:
@Inject private QuestionCategoryRepository questionCategoryRepository;
I noticed, that IntelliJ reported the following error: “There is more than one bean of QuestionCategoryRepository type”. It seemed wierd to me, so I went ahead and started my application. The context was built successfully and there were no problems with the startup at all.
It turned out that IntelliJ really had provided me a useful hint, because I noticed that I have an
@ComponentScan(basePackages = "...")
annotation on my class that is used for persistence related configuration. The scope of this annotation was involving the package where I had my repositories defined.
This is why IntelliJ believed, that there are two definitions.
Actually, there were three.
I also noticed that I have
@EnableJpaRepositories(basePackages = "...")
on my configuration class, pointing to the packes where my repositories reside.
It turned out that I can remove both the @Repository
annotation and the @ComponentScan
as well, becauses the @EnableJpaRepositories
was enough to detect my repositories. Of course, @ComponentScan
might need to be kept if it is for scanning some other classes.