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
相关产品推荐
相关产品推荐

