Spring @Autowired can not wire Jpa repository

27,957

I also had the same problem.I solved it with following solution. If your Entity classes and Repositories in a different package you need to use following annotations.

@SpringBootApplication
@EntityScan(basePackages = {"EntityPackage"} )
@EnableJpaRepositories(basePackages = {"RepositoryPackage"})
public class Application {

    public static void main(String[] args) {

        SpringApplication.run(Application.class, args);

    }
}
Share:
27,957
krzakov
Author by

krzakov

Java dev.

Updated on June 01, 2021

Comments

  • krzakov
    krzakov almost 3 years

    I clearly missing something here. I'm making a simple spring boot app with spring data jpa inluded and face follwing error:

    Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [locassa.domain.repository.PersonRepository] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1373) ~[spring-beans-4.2.3.RELEASE.jar:4.2.3.RELEASE]
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1119) ~[spring-beans-4.2.3.RELEASE.jar:4.2.3.RELEASE]
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1014) ~[spring-beans-4.2.3.RELEASE.jar:4.2.3.RELEASE]
        at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:545) ~[spring-beans-4.2.3.RELEASE.jar:4.2.3.RELEASE]
        ... 32 common frames omitted
    

    My code:

    Application:

    @SpringBootApplication
    @ComponentScan(basePackages = {"app.controller", "app.domain"})
    public class Application {
    
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    
    }
    

    pom.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>pl.mosek</groupId>
        <artifactId>pl.mosek</artifactId>
        <version>0.1-SNAPSHOT</version>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>1.3.0.RELEASE</version>
        </parent>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>1.16.6</version>
            </dependency>
    
            <dependency>
                <groupId>com.h2database</groupId>
                <artifactId>h2</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-jpa</artifactId>
            </dependency>
        </dependencies>
    
        <properties>
            <java.version>1.8</java.version>
        </properties>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
    </project>
    

    Controller:

    @RestController
    public class TestController {
    
        @Autowired
        PersonService personService;
    
        @RequestMapping("/")
        public String index() {
            return "Test spring boot";
        }
    
        @RequestMapping("/person/{id}")
        public Person personById(@PathVariable Long id) {
            return personService.findPerson(id);
        }
    }
    

    PersonService:

    public interface PersonService {
    
        Person findPerson(Long id);
    }
    

    PersonServiceImpl:

    @Service
    public class PersonServiceImpl implements PersonService {
    
        @Autowired
        PersonRepository personRepository;
    
        public Person findPerson(Long id) {
           return personRepository.findOne(id);
        }
    }
    

    PersonRepository (this one cannot be autowired):

    public interface PersonRepository extends CrudRepository<Person, Long> {
    }
    

    Searched on the web already. I didnt found a thing. Any ideas?

  • krzakov
    krzakov over 8 years
    Both of them are under app.domain. Entities are under app.domain.model and repositories under app.domain.repository
  • krzakov
    krzakov over 8 years
    I tried @EnableJpaRepositories but without combinationwith @EntityScan. Both of those annotations solve the isssue.
  • Dan W
    Dan W about 7 years
    Thank you so much.
  • Jorge Machado
    Jorge Machado about 7 years
    So you don't need the autowire?
  • Kanagavelu Sugumar
    Kanagavelu Sugumar about 6 years
    I am not using spring boot, so @EntityScan is not located? is it boot is mandatory to use this ?
  • JustTry
    JustTry over 5 years
    org.springframework.boot.autoconfigure.domain.EntityScan and org.springframework.data.jpa.repository.config.EnableJpaRepo‌​sitories class solved my problem, I need to use both of them
  • Shalika
    Shalika about 5 years
    This fix the issue.I add @ComponentScan(basePackages = {"basepackage"}) too.Thank you very much.