mongodbspring-boot

required a bean of type 'com.supriya.banking.repository.AccountRepository' that could not be found



APPLICATION FAILED TO START


Description:

Field accountRepository in com.supriya.banking.service.AccountService required a bean of type 'com.supriya.banking.repository.AccountRepository' that could not be found.

The injection point has the following annotations: - @org.springframework.beans.factory.annotation.Autowired(required=true)

Action:

Consider defining a bean of type 'com.supriya.banking.repository.AccountRepository' in your configuration.

Why is it asking for bean creation, shouldn't it create on its own?

build.gradle

plugins {
    id 'java'
    id 'org.springframework.boot' version '3.3.2'
    id 'io.spring.dependency-management' version '1.1.6'
}

group = 'com.supriya'
version = '0.0.1-SNAPSHOT'

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(17)
    }
}

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    google()
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
    implementation group: 'org.springframework.data', name: 'spring-data-mongodb', version: '4.3.1'
}

tasks.named('test') {
    useJUnitPlatform()
}

application.properties

spring.application.name=banking

# mongoDB configuration
spring.data.mongodb.host=localhot
spring.data.mongodb.port=27017
spring.data.mongodb.database=bank

Repository

package com.supriya.banking.repository;

import com.supriya.banking.model.Account;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface AccountRepository extends MongoRepository<Account, String> {

}

Service

package com.supriya.banking.service;

import com.supriya.banking.exception.AccountNotPresentException;
import com.supriya.banking.exception.DuplicateEntryException;
import com.supriya.banking.model.Account;
import com.supriya.banking.repository.AccountRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Optional;

@Service
public class AccountService {

    @Autowired
    private AccountRepository accountRepository;

    public void add(Account account) throws DuplicateEntryException {
        Optional<Account> account1 = accountRepository.findById(account.getAccountNumber());
        if (account1.isPresent()) throw new DuplicateEntryException("Duplicate Entry...");
        accountRepository.save(account);
    }

    public List<Account> getAllAccounts() {
        return accountRepository.findAll();
    }

    public Account getAccountByAccountNumber(String accountNumber) throws AccountNotPresentException {
        Optional<Account> account = accountRepository.findById(accountNumber);
        if (account.isEmpty()) throw new AccountNotPresentException("Account number does not exists...");
        return account.get();
    }
}

Controller

package com.supriya.banking.controller;

import com.supriya.banking.exception.AccountNotPresentException;
import com.supriya.banking.exception.DuplicateEntryException;
import com.supriya.banking.model.Account;
import com.supriya.banking.service.AccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/banking")
public class AccountController {

    @Autowired
    private AccountService accountService;

    @PostMapping("/add")
    public ResponseEntity<String> addDetails(@RequestBody Account account) throws DuplicateEntryException {
        accountService.add(account);
        return new ResponseEntity<>("Success", HttpStatus.CREATED);
    }

    @GetMapping("all")
    public ResponseEntity<List<Account>> getAllAccounts() {
        return new ResponseEntity<>(accountService.getAllAccounts(), HttpStatus.OK);
    }

    @GetMapping("{accountNumber}")
    public ResponseEntity<Account> getByAccountNumber(@PathVariable("accountNumber") String account) throws AccountNotPresentException {
        return new ResponseEntity<>(accountService.getAccountByAccountNumber(account), HttpStatus.OK);
    }
}

Entity

package com.supriya.banking.model;

import lombok.*;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

@Builder
@Getter
@Setter
@ToString
@Document(collation = "account")
public class Account {

    @Id
    private String accountNumber;

    private String accountHolderName;

    private long accountBalance;
}

Went through some of the solution over stackoverflow, did not get resolve


Solution

  • remove your own dependency of mongodb with version set, and add this line instead:

    implementation 'org.springframework.boot:spring-boot-starter-data-mongodb'
    

    in general use start.spring.io for defining spring-related dependencies