当前位置: 首页 > news >正文

【Springboot】解决问题 o.s.web.servlet.PageNotFound : No mapping for *

使用 cursor 进行老项目更新为 springboot 的 web 项目,发生了奇怪的问题,就是 html 文件访问正常,但是静态文件就是 404

检查了各种配置,各种比较,各种调试,最后放弃时候,清理没用的配置文件,发现了一个老的配置类

@Configuration
public class DateTimeConfig extends WebMvcConfigurationSupport {

    Logger logger = LoggerFactory.getLogger(DateTimeConfig.class);

    @Bean
    public FormattingConversionService mvcConversionService() {
        logger.info("mvcConversionService 执行了");
        DefaultFormattingConversionService conversionService = new DefaultFormattingConversionService(false);

        DateTimeFormatterRegistrar dateTimeRegistrar = new DateTimeFormatterRegistrar();
        dateTimeRegistrar.setDateFormatter(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
        dateTimeRegistrar.setDateTimeFormatter(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
        dateTimeRegistrar.registerFormatters(conversionService);

        DateFormatterRegistrar dateRegistrar = new DateFormatterRegistrar();
        dateRegistrar.setFormatter(new DateFormatter("yyyy-MM-dd"));
        dateRegistrar.registerFormatters(conversionService);

        return conversionService;
    }
}

WebMvcConfigurationSupport 替换为 WebMvcConfigurerAdapter 解决了问题,原因在于两者在 Spring MVC 中的 行为差异配置优先级。以下是详细分析:


1. 行为差异

特性WebMvcConfigurationSupportWebMvcConfigurerAdapter
作用完全覆盖 Spring MVC 默认配置扩展 Spring MVC 默认配置
影响范围全局配置,优先级最高局部配置,优先级较低
推荐使用场景需要完全自定义 MVC 配置仅需扩展默认配置

2. 问题根源

使用 WebMvcConfigurationSupport 的问题
  • 覆盖默认配置:继承 WebMvcConfigurationSupport完全禁用 Spring Boot 的自动配置(如静态资源处理、视图解析器等)。
  • 静态资源失效:默认的静态资源路径(classpath:/static/)会被覆盖,导致资源无法访问。
使用 WebMvcConfigurerAdapter 的优势
  • 扩展默认配置WebMvcConfigurerAdapter扩展 Spring MVC 配置,不会覆盖默认行为。
  • 保留自动配置:Spring Boot 的自动配置(如静态资源处理)仍然生效。

3. 解决方案

推荐使用 WebMvcConfigurer

WebMvcConfigurerAdapter 已被标记为 @Deprecated,建议直接实现 WebMvcConfigurer 接口:

@Configuration
public class WebConfig implements WebMvcConfigurer {
    
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry
            .addResourceHandler("/plugins/**")
            .addResourceLocations("classpath:/static/plugins/")
            .setCachePeriod(0);
    }
}
关键配置对比
配置项WebMvcConfigurationSupportWebMvcConfigurer
静态资源处理需手动配置所有资源路径仅需扩展默认配置
视图解析器需手动配置自动配置 + 扩展
拦截器需手动注册自动配置 + 扩展

4. 验证步骤

  1. 检查静态资源路径

    jar -tvf target/*.jar | grep "mdui.min.css"
    # 正确输出:
    # BOOT-INF/classes/static/plugins/mdui/css/mdui.min.css
    
  2. 访问资源URL

    curl -v http://localhost:8080/plugins/mdui/css/mdui.min.css
    # 预期响应:
    # HTTP/1.1 200
    # Content-Type: text/css
    
  3. 查看资源加载日志
    application.yml 中开启调试日志:

    logging:
      level:
        org.springframework.web: DEBUG
    

    正常日志

    DEBUG o.s.w.s.r.ResourceHttpRequestHandler - Resource found: class path resource [static/plugins/mdui/css/mdui.min.css]
    
  • 优化后的代码
@Configuration
public class DateTimeConfig implements WebMvcConfigurer {

    private static final Logger logger = LoggerFactory.getLogger(DateTimeConfig.class);

    @Override
    public void addFormatters(FormatterRegistry registry) {
        logger.info("DateTimeConfig: 注册自定义日期时间格式化器");

        // 注册 Java 8 日期时间格式化器
        DateTimeFormatterRegistrar dateTimeRegistrar = new DateTimeFormatterRegistrar();
        dateTimeRegistrar.setDateFormatter(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
        dateTimeRegistrar.setDateTimeFormatter(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
        dateTimeRegistrar.registerFormatters(registry);

        // 注册传统日期格式化器
        DateFormatterRegistrar dateRegistrar = new DateFormatterRegistrar();
        dateRegistrar.setFormatter(new DateFormatter("yyyy-MM-dd"));
        dateRegistrar.registerFormatters(registry);
    }
}

5. 总结

  • WebMvcConfigurationSupport:适合需要 完全自定义 MVC 配置的场景,但会 覆盖默认行为
  • WebMvcConfigurer:适合 扩展默认配置,保留 Spring Boot 的自动配置能力。

通过替换为 WebMvcConfigurer,静态资源处理得以保留,问题自然解决。

相关文章:

  • 时钟树的理解
  • 2025生成式AI技术趋势深度解析:从企业战略到轻量化部署的全面转型
  • SpringBoot+Redis+Mybatis-plus黑马点评
  • Java多线程与高并发专题——深入ReentrantReadWriteLock
  • Vue3 Composition API与十大组件开发案例详解
  • 千峰React:案例二
  • DeepSeek实战
  • 51c自动驾驶~合集22
  • 蓝桥杯web第三天
  • 《Python实战进阶》No 8:部署 Flask/Django 应用到云平台(以Aliyun为例)
  • FFmpeg入门:最简单的音频播放器
  • 前端实现上传图片到OSS(Vue3+vant)
  • 网络安全深度剖析
  • GPIO(嵌入式学习)
  • 当AI重构认知:技术狂潮下的教育沉思录
  • 信息学奥赛一本通(C++版)
  • java容器 LIst、set、Map
  • html+js 轮播图
  • Seaborn知识总结
  • ESP32+Mixly-WiFi
  • 全网网站建设优化/百度官网电话
  • 什么网站可以做ui兼职/常见的网络营销模式
  • 住房和城乡建设部网站监理工程师/手机网页设计制作网站
  • 揭阳网站制作工具/免费注册推广网站
  • 最全的网站大全/长沙网站优化指导
  • 镇江网站排名优化费用/湘潭seo培训