springjparepositoryjavabeansautowired

Spring JPA failing to find repository


Spring JPA application is failing to find the repository. I have tried annotating it with @repository, putting the controller, service and repository in component scan etc but I'm not having any luck. Anybody spot the line I'm missing? I've added a picture to show the layout of the packages.

The message been provided when compiling:

***************************
APPLICATION FAILED TO START
***************************

Description:

Parameter 0 of constructor in member.services.MemberServiceImpl required a bean of type 'member.repositories.MemberRepository' that could not be found.


Action:

Consider defining a bean of type 'member.repositories.MemberRepository' in your configuration.

Classes:

@SpringBootApplication
public class MemberApplication {

    public static void main(String[] args) {
        SpringApplication.run(MemberApplication.class, args);
    }
}
@RestController
@Slf4j
public class MemberController {
    private MemberService memberService;

    @Autowired
    public MemberController(MemberService memberService) {
        this.memberService = memberService;
    }
    
    @GetMapping("/retrieve")
    public String retrieveAllMembers() {
        memberService.retrieveAllMembers();

        return "Success";
    }
}
@Slf4j
@Service
public class MemberServiceImpl implements MemberService {
    MemberRepository memberRepository;

    @Autowired
    public MemberServiceImpl(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }

    public void addMemberToDatabase(Member member) {
        memberRepository.save(member);
    }

    public void retrieveAllMembers() {
        memberRepository.findAll();
    }
}
public interface MemberService {
    void retrieveAllMembers();
    void addMemberToDatabase(Member member);
}

/**
 * MemberRepository.
 */
public interface MemberRepository extends JpaRepository<Member, Long> {
}
@Entity
public class Member {
    @Id
    @GeneratedValue (strategy = GenerationType.AUTO)
    private Long id;
    private String firstName;
    private String LastName;

    public Member() {
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return LastName;
    }

    public void setLastName(String lastName) {
        LastName = lastName;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Long getId() {
        return id;
    }
}

enter image description here

<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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.example</groupId>
  <artifactId>backend</artifactId>
  <version>1.0-SNAPSHOT</version>
  <name>Archetype - backend</name>
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.2.1</version>
  </parent>
  <url>http://maven.apache.org</url>
  <properties>
    <maven.compiler.source>17</maven.compiler.source>
    <maven.compiler.target>17</maven.compiler.target>
  </properties>
  <profiles>
    <profile>
      <id>spring-data-next-releasetrain</id>
      <properties>
        <spring-data-bom.version>2024.0.0-SNAPSHOT</spring-data- 
  bom.version>
  </properties>
</profile>

<profile>
   <id>spring-data-next</id>
  <properties>
    <spring-data-bom.version>2023.1.2-SNAPSHOT</spring-data-bom.version>
  </properties>
</profile>
  </profiles>
  <dependencies>
    <dependency>
      <groupId>org.springframework.data</groupId>
      <artifactId>spring-data-jpa</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-devtools</artifactId>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>org.eclipse.angus</groupId>
      <artifactId>angus-mail</artifactId>
      <version>2.0.1</version>
    </dependency>
    <dependency>
      <groupId>com.opencsv</groupId>
      <artifactId>opencsv</artifactId>
      <version>5.3</version>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
      <version>3.2.1</version>
    </dependency>
    <dependency>
      <groupId>org.springframework.data</groupId>
      <artifactId>spring-data-jpa</artifactId>
      <version>3.2.1</version>
    </dependency>
    <dependency>
      <groupId>com.google.code.gson</groupId>
      <artifactId>gson</artifactId>
      <version>2.8.6</version>
    </dependency>
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.18.30</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>org.hibernate.orm</groupId>
      <artifactId>hibernate-core</artifactId>
      <version>7.0.0.Alpha1</version>
    </dependency>
  </dependencies>
</project>

Solution

  • In the end I used @EnableJpaRepositories but made it cover all the repository package rather than that of jpa:

    @EnableJpaRepositories (basePackages = "member.repositories")
    

    I took @repository out of the repository as this was no longer required. Entity was changed to:

    @Data
    @Entity
    @Table (name="member")
    public class Member {
    
    @Id
    @GeneratedValue (strategy = GenerationType.IDENTITY)
    @Column (name="person_id")
    private Long personId;
    @Column(name="first_name")
    private String firstName;
    @Column(name="last_name")
    private String LastName;
    
        <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.0.0</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <url>http://maven.apache.org</url>
    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
    </properties>
    <profiles>
        <profile>
            <id>spring-data-next-releasetrain</id>
            <properties>
                <spring-data-bom.version>2024.0.0-SNAPSHOT</spring-data-bom.version>
            </properties>
        </profile>
    
        <profile>
            <id>spring-data-next</id>
            <properties>
                <spring-data-bom.version>2023.1.2-SNAPSHOT</spring-data-bom.version>
            </properties>
        </profile>
    </profiles>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
    

    I'm reckoning the versions could probably be tidied up and better ones put in but for the moment this all seems to be working!

    Thanks @M. Deinum and @octo-carrot - putting it all together seemed to work! Couldn't pick answers as they are comments sorry!