You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot启动失败:无法找到AccountRepository类型Bean求助

应用启动失败

错误信息

com.supriya.banking.service.AccountService中的accountRepository字段需要一个类型为'com.supriya.banking.repository.AccountRepository'的Bean,但未找到。
注入点注解:

  • @org.springframework.beans.factory.annotation.Autowired(required=true)
    官方建议:考虑在配置中定义一个类型为'com.supriya.banking.repository.AccountRepository'的Bean。

疑问

为什么需要手动创建这个Bean?Spring不是应该自动创建吗?

相关代码

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

AccountRepository.java

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> {

}

AccountService.java

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();
    }
}

AccountController.java

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);
    }
}

Account.java

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;
}

解决方案

  1. 替换MongoDB依赖为Spring Boot Starter
    直接引入spring-data-mongodb不会触发Spring Boot的自动配置,换成starter依赖:

    // 删除原有的spring-data-mongodb依赖,添加下面的starter
    implementation 'org.springframework.boot:spring-boot-starter-data-mongodb'
    
  2. 修正Entity的@Document注解参数
    collation是排序规则配置,指定集合名要用collection:

    @Document(collection = "account")
    public class Account {
        // ... 原有代码
    }
    
  3. 修正配置文件中的主机名拼写错误
    localhot改为localhost:

    spring.data.mongodb.host=localhost
    
  4. 确保Spring能扫描到Repository

    • 检查Spring Boot主类所在包是否为com.supriya(或其上层),这样默认扫描会覆盖com.supriya.banking下的所有组件。
    • 如果主类在其他包,添加@EnableMongoRepositories指定Repository路径:
      @SpringBootApplication
      @EnableMongoRepositories(basePackages = "com.supriya.banking.repository")
      public class BankingApplication {
          public static void main(String[] args) {
              SpringApplication.run(BankingApplication.class, args);
          }
      }
      

内容的提问来源于stack exchange,提问作者Supriya Maity

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 06:44:51