Spring Boot 2.x → 3.x 升级后 "No static resource" 错误完整排查指南
在将 Spring Boot 从 2.x 升级到 3.x 后,很多同学会遇到 No static resource 报错。
这通常和 资源处理配置的改变 以及 Jakarta EE 的引入 有关。下面我们通过表格、代码示例和实战排查技巧,快速定位并解决问题。
常见原因对比表
问题领域 | 2.x 配置/用法 | 3.x 配置/用法 | 关键变更点 |
Servlet API | javax.servlet | jakarta.servlet | 包名前缀从 javax 更换为 jakarta |
静态资源路径 | 默认:classpath:/static/ 等 | 默认路径同 2.x,但配置属性可能有变 | 建议检查并显式配置 |
CORS 配置 | .addAllowedOrigin("*") | .addAllowedOriginPattern("*") | addAllowedOrigin 不再接受 *,需改用 addAllowedOriginPattern |
自定义配置 | 自动配置生效即可 | 可能需要显式实现 WebMvcConfigurer 并添加资源处理器 | 静态资源处理器需要更明确配置 |
详细排查步骤
1. 检查并更新 Servlet 导入
Spring Boot 3.x 迁移到 Jakarta EE,所有与 Web 相关的 API 包路径都从 javax 变成了 jakarta。
// Spring Boot 3.x 正确写法
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
建议:全局搜索 javax.servlet,统一替换为 jakarta.servlet。
2. 显式配置静态资源路径
虽然默认位置未变(classpath:/static/, classpath:/public/ 等),
但升级后可能需要在配置文件中显式指定。
# application.properties
spring.web.resources.static-locations=classpath:/static/
spring.mvc.static-path-pattern=/**
# application.yml
spring:
web:
resources:
static-locations: classpath:/static/
mvc:
static-path-pattern: "/**"
提示:可以配置多个路径,如 classpath:/static/,classpath:/public/。
3. 检查自定义 WebMvc 配置
如果你自定义了 Web 配置类,需要手动添加静态资源映射。
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
// 静态资源
registry.addResourceHandler("/**")
.addResourceLocations("classpath:/static/");
// WebJars
registry.addResourceHandler("/webjars/**")
.addResourceLocations("classpath:/META-INF/resources/webjars/");
}
}
4. 更新 CORS 配置
Spring Boot 3.x 中,addAllowedOrigin("*") 已弃用。
configuration.addAllowedOriginPattern("*"); // 新写法
5. 检查启动类注解
确保主类使用 @SpringBootApplication,否则部分自动配置(包括静态资源)可能不会生效。
@SpringBootApplication
public class YourApplication {
public static void main(String[] args) {
SpringApplication.run(YourApplication.class, args);
}
}
实战排查技巧
- 确认资源是否打包
检查 target/classes/static/(Maven)或 build/resources/main/static/(Gradle)。
如果目录下没有文件,说明是 打包问题,而不是 Spring 配置问题。 - 开启调试日志查看映射
在 application.properties 添加:
logging.level.org.springframework.web=DEBUG
logging.level.org.springframework.boot.autoconfigure.web=DEBUG
重启应用后,日志中会显示静态资源路径的映射情况。
i 其他常见升级问题
除了静态资源问题,从 Spring Boot 2.x 升级到 3.x 还可能遇到:
- JDK 版本要求:Spring Boot 3.x 需要 JDK 17+。
- 包名迁移:如 javax.validation → jakarta.validation。
- Swagger 兼容性:Swagger 2 不再兼容,需升级到 SpringDoc OpenAPI。
- Spring Security:WebSecurityConfigurerAdapter 已被弃用,需使用基于 SecurityFilterChain 的配置。
- 第三方依赖:确保 MyBatis、Druid、Sentinel 等使用兼容 Spring Boot 3.x 的版本。
总结
- 错误根源:Jakarta EE 包迁移 & 静态资源配置差异。
- 首要检查:
- javax.* → jakarta.*
- 显式配置 spring.web.resources.static-locations
- 自定义 WebMvcConfigurer 资源映射
- 实战技巧:确认资源是否打包、打开调试日志。
大多数情况下,只要修正 导包 + 资源路径配置,就能快速解决 "No static resource" 报错。