Spring Boot启动失败:BookController无法找到BookService Bean
解决Spring Boot找不到BookService Bean的问题
核心问题分析
启动报错的根源有两个:
BookServiceImpl未实现BookService接口,Spring无法将其识别为BookService类型的BeanBookServiceImpl中的findAllBooks方法是包私有权限,无法被外部调用
修复步骤
1. 让BookServiceImpl实现BookService接口
修改实现类,实现对应接口并修正方法权限:
package org.codefinity.com.codefinity.firstrestapibooks.service; import lombok.AllArgsConstructor; import org.codefinity.com.codefinity.firstrestapibooks.DTO.BookRequestDTO; import org.codefinity.com.codefinity.firstrestapibooks.DTO.BookResponseDTO; import org.codefinity.com.codefinity.firstrestapibooks.DTO.MapperBook; import org.codefinity.com.codefinity.firstrestapibooks.model.Book; import org.codefinity.com.codefinity.firstrestapibooks.repository.BookRepository; import org.springframework.stereotype.Service; import java.util.List; @Service public class BookServiceImpl implements BookService { private final BookRepository bookRepository; public BookServiceImpl(BookRepository bookRepository){ this.bookRepository = bookRepository; } @Override public List<BookResponseDTO> findAllBooks() { return bookRepository.getAllBooks().stream() .map(MapperBook::modelToRespondDto) .toList(); } @Override public BookResponseDTO createBook(BookRequestDTO book) { Book modelBook = MapperBook.dtoRequestoModel(book); Book repositoryBook = bookRepository.addBook(modelBook); return MapperBook.modelToRespondDto(repositoryBook); } @Override public BookResponseDTO updateBook(String id, BookRequestDTO book) { Book modelBook = MapperBook.dtoRequestoModel(book); Book repositoryBook = bookRepository.updateBook(id, modelBook); return MapperBook.modelToRespondDto(repositoryBook); } @Override public void deleteBook(String id) { bookRepository.deleteBook(id); } }
2. 优化BookController的注入与注解
替换@Controller为@RestController(REST API需返回JSON而非视图),并去掉冗余的@Autowired注解(Spring 4.3+支持构造函数自动装配):
package org.codefinity.com.codefinity.firstrestapibooks.controller; import org.codefinity.com.codefinity.firstrestapibooks.DTO.BookRequestDTO; import org.codefinity.com.codefinity.firstrestapibooks.DTO.BookResponseDTO; import org.codefinity.com.codefinity.firstrestapibooks.service.BookService; import org.springframework.web.bind.annotation.*; import java.util.List; @RestController @RequestMapping("/books") public class BookController { private final BookService bookService; public BookController(BookService bookService){ this.bookService = bookService; } @GetMapping public List<BookResponseDTO> findAllBooks(){ return bookService.findAllBooks(); } @PostMapping public BookResponseDTO createBook(@RequestBody BookRequestDTO book){ return bookService.createBook(book); } @PutMapping("/{id}") public BookResponseDTO updateBook(@PathVariable String id, @RequestBody BookRequestDTO book){ return bookService.updateBook(id, book); } @DeleteMapping("/{id}") public void deleteBook(@PathVariable String id){ bookService.deleteBook(id); } }
3. 统一pom.xml依赖版本
移除依赖中的手动版本号,让parent统一管理,同时替换webmvc-test为通用测试依赖:
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>4.0.6</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>org.codefinity</groupId> <artifactId>first-rest-api-books</artifactId> <version>0.0.1-SNAPSHOT</version> <name>com.codefinity.firstrestapiooks</name> <description>com.codefinity.firstrestapiooks</description> <properties> <java.version>25</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webmvc</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.modelmapper</groupId> <artifactId>modelmapper</artifactId> <version>3.2.6</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <scope>compile</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
额外检查
- 确保
BookService接口已正确定义所有方法签名 - 确认Spring Boot启动类的包路径能覆盖
controller、service等子包(默认启动类所在包为根扫描路径)
内容的提问来源于stack exchange,提问作者Gnome
相关产品推荐
相关产品推荐

