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
,搞定收工。