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

Spring Boot 3.0.3中RestController请求返回404问题及版本差异咨询

Spring Boot 3.0.3 接口404问题解决与版本变化说明

问题场景

我有一个Spring Boot 3.0.3版本的Web应用,核心代码如下:

pom.xml片段

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.0.3</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<properties>
    <start-class>matin.example.demo.DemoApplication</start-class>
    <java.version>17</java.version>
</properties>
<dependencies>
    <!--<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

DemoApplication类

package matin.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

}

FController类

package matin.example.demo.api;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;


@RestController
public class FController {
    @GetMapping(value = "/re")
    public String viewHomePage(/*Model model, HttpServletRequest request*/) {
        /*request.getSession().setAttribute("onlineUser", request.getSession().getAttribute("onlineUser") == null ? 1 : Integer.valueOf(request.getSession().getAttribute("onlineUser").toString()) + 1);
        System.out.println(request.getSession().getAttribute("onlineUser") + "<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<");*/
        return "index";
    }
}

当请求localhost:8080/re时返回404 Not Found错误,但降级到Spring Boot 2.7.7后可正常运行。

Spring Boot 3.x关键变化(与该问题相关)

  • API依赖切换:全面从Java EE的javax.*包切换到Jakarta EE的jakarta.*包,底层Servlet容器适配逻辑同步调整。
  • 组件扫描规则收紧:基于Spring Framework 6,组件扫描的自动范围判断更严格,若启动类与组件的包父子关系存在模糊性,可能导致组件未被注册。
  • 最低Java版本要求:强制要求Java 17及以上,编译、运行环境的变化可能间接影响类加载逻辑。

问题解决方法

核心原因是Spring Boot 3.x的组件扫描未覆盖到FController所在的matin.example.demo.api包,可通过以下方式解决:

方法一:显式指定组件扫描范围

在DemoApplication类上添加@ComponentScan注解,明确指定要扫描的包路径,确保包含控制器所在包:

package matin.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication
@ComponentScan(basePackages = {"matin.example.demo", "matin.example.demo.api"})
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

}

方法二:排查编译与缓存问题

当前项目结构中api是matin.example.demo的子包,理论上会被默认扫描。若仍未生效,可检查编译后的class文件路径是否正确,或清除项目编译缓存后重新构建。

方法三:确认启动类配置

检查pom.xml中的start-class配置是否准确指向matin.example.demo.DemoApplication,避免启动类加载错误导致组件扫描失效。


内容的提问来源于stack exchange,提问作者reza ramezani matin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 05:22:49