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

Spring Boot启动失败:BookController无法找到BookService Bean

解决Spring Boot找不到BookService Bean的问题

核心问题分析

启动报错的根源有两个:

  1. BookServiceImpl未实现BookService接口,Spring无法将其识别为BookService类型的Bean
  2. BookServiceImpl中的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.01 18:43:10