1. 引言

在使用 Spring 5.x 或更高版本开发时,你可能遇到过这样一个编译警告:

Warning: "The type WebMvcConfigurerAdapter is deprecated"

这并不是致命错误,但作为一个追求代码整洁的高级开发者,这种“过时提示”最好及时处理。本文将解释这个警告的来龙去脉,并给出简单粗暴的解决方案。

✅ 适用场景:Spring 5+ 或 Spring Boot 2+ 项目中配置 MVC 时继承了 WebMvcConfigurerAdapter
⚠️ 踩坑提示:旧教程或迁移项目中常见,新手容易忽略其影响


2. 警告出现的原因

这个警告的核心原因一句话就能说清:

从 Spring 5 开始,WebMvcConfigurerAdapter 被标记为 @Deprecated,推荐直接实现 WebMvcConfigurer 接口。

我们来还原一下历史背景:

Spring 4 及之前的做法

在 Java 8 之前,接口不能有方法实现,所以 Spring 提供了一个抽象类 WebMvcConfigurerAdapter,它实现了 WebMvcConfigurer 接口并为所有方法提供了空实现:

@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor());
    }

    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        registry.jsp("/WEB-INF/jsp/", ".jsp");
    }
}

开发者只需继承这个适配器类,按需重写方法即可,无需实现接口中所有方法。

Java 8 默认方法的引入

Java 8 引入了 default method 特性,允许接口定义带有默认实现的方法。于是 Spring 团队顺势而为:

直接在 WebMvcConfigurer 接口中为所有方法添加 default 实现!

这意味着:不再需要一个中间的抽象类来提供默认实现,你可以直接实现该接口,只覆盖你需要的方法。

因此,WebMvcConfigurerAdapter 完成了它的历史使命,被标记为 @Deprecated


3. 解决方案(简单三步)

要消除这个警告,只需做以下改动:

✅ 步骤 1:改为实现接口而非继承适配器

@Configuration
public class WebConfig implements WebMvcConfigurer {  // 注意这里是 implements
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor());
    }

    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        registry.jsp("/WEB-INF/jsp/", ".jsp");
    }
}

就这么简单!原来的逻辑一行都不用改,只需要:

  • extends WebMvcConfigurerAdapter
    改成
    implements WebMvcConfigurer
  • 删除类继承关系

✅ 步骤 2:移除 super 调用(如有)

如果你之前在重写方法里写了 super.addInterceptors(registry); 这类代码,请删掉!

因为现在是接口默认方法,不是父类方法,调用 super 没有意义,甚至可能导致意外行为。

❌ 错误写法:

@Override
public void addInterceptors(InterceptorRegistry registry) {
    super.addInterceptors(registry); // ❌ 不需要!
    registry.addInterceptor(new MyInterceptor());
}

✅ 正确写法:

@Override
public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(new MyInterceptor()); // 直接添加即可
}

✅ 步骤 3:验证无警告

重新编译后,IDE 中的黄色警告应该消失。Maven/Gradle 构建也不再提示该类已弃用。


4. 注意事项与最佳实践

项目 建议
✅ 是否必须修改? 非强制,但建议尽早升级,避免未来版本兼容问题
✅ Spring Boot 用户注意 如果你用的是 @EnableWebMvc + 自定义配置,才需要手动改;否则 Spring Boot 默认自动配置已处理好
✅ 多配置类场景 多个类实现 WebMvcConfigurer,Spring 会合并所有配置
⚠️ 方法冲突怎么办? 某些方法如 addViewControllers 可安全叠加,但像 configureMessageConverters 是替换式,需小心顺序

5. 总结

  • WebMvcConfigurerAdapter 已成为历史,Spring 5+ 应直接实现 WebMvcConfigurer 接口
  • 改动极小,基本属于“搜索替换”级别操作
  • 利用 Java 8 的 default method 是 Spring 向现代化演进的重要一步
  • 清理这类警告,不仅能提升代码质量,也能避免未来升级踩坑

📌 一句话总结:
删掉 extends WebMvcConfigurerAdapter,改成 implements WebMvcConfigurer,搞定收工。


原始标题:Warning: "The type WebMvcConfigurerAdapter is deprecated"