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; }
解决方案
替换MongoDB依赖为Spring Boot Starter
直接引入spring-data-mongodb不会触发Spring Boot的自动配置,换成starter依赖:// 删除原有的spring-data-mongodb依赖,添加下面的starter implementation 'org.springframework.boot:spring-boot-starter-data-mongodb'修正Entity的@Document注解参数
collation是排序规则配置,指定集合名要用collection:@Document(collection = "account") public class Account { // ... 原有代码 }修正配置文件中的主机名拼写错误
localhot改为localhost:spring.data.mongodb.host=localhost确保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); } }
- 检查Spring Boot主类所在包是否为
内容的提问来源于stack exchange,提问作者Supriya Maity
相关产品推荐
相关产品推荐

