WebMvcConfigurer自定义配置

1. WebMvcConfigurer(轻量级扩展配置)

1.1 简介

WebMvcConfigurer 是 Spring 提供的接口,用于扩展 Spring MVC 的默认行为。它是一种非侵入式的配置方式,可以轻松地进行各种自定义配置,如拦截器、消息转换器、跨域设置等。实现 WebMvcConfigurer 不会影响 Spring Boot 的自动配置,是最常见的扩展方式。

1.2 常用功能

  • 自定义拦截器 :通过实现 addInterceptors 方法添加拦截器。
  • 自定义消息转换器 :通过 extendMessageConverters 方法扩展消息转换器。
  • 跨域配置 :通过 addCorsMappings 来配置跨域资源共享(CORS)。
  • 静态资源配置 :通过 addResourceHandlers 自定义静态资源的路径。

1.3 使用场景

WebMvcConfigurer 适合大部分场景,可以满足自定义消息转换器、静态资源映射、拦截器等常见需求,且不会影响 Spring Boot 的自动配置。

2. WebMvcConfigurationSupport(深度定制配置)

2.1 简介

WebMvcConfigurationSupport 是 Spring MVC 的一个配置基类,通常用于完全接管 Spring MVC 的配置。继承这个类后,Spring Boot 自动配置将被禁用,因此它适用于需要完全控制 Spring MVC 行为的场景。

2.2 常用功能

  • 深度定制 Spring MVC 行为:继承该类后,所有 Spring MVC 的配置都需要手动定义,包括视图解析器、消息转换器、拦截器等。
  • 完全覆盖 Spring MVC 默认配置:Spring Boot 的自动配置会失效,需要自行配置所有必要的 MVC 组件。

2.3 使用场景

  • 需要完全掌控 Spring MVC 行为的复杂场景。
  • WebMvcConfigurer 不能满足定制需求时(如需要重写默认的 MVC 配置)。

注意:继承 WebMvcConfigurationSupport 会导致 Spring Boot 的自动配置失效,因此大部分开发中更推荐使用 WebMvcConfigurer

3. 示例

通过实现WebMvcConfigurer接口的 extendMessageConverters 方法扩展消息转换器。

自定义消息转换器(日期格式处理):

java 复制代码
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import com.fasterxml.jackson.databind.ObjectMapper;

@Configuration // 表明这是一个 Spring 配置类,Spring 容器会自动扫描并加载该配置
public class WebConfig implements WebMvcConfigurer {

    /**
     * 扩展 Spring MVC 框架的消息转换器
     * 这里是通过自定义 Jackson 的 `MappingJackson2HttpMessageConverter` 来处理 JSON 数据
     * 并为其设置自定义的日期格式
     * 
     * @param converters Spring MVC 自动传入的消息转换器列表
     */
    @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        // 输出日志,提示消息转换器正在被扩展
        log.info("扩展消息转换器...");
        
        // 创建一个 JSON 消息转换器对象
        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
        
        // 创建一个 ObjectMapper(这是 Jackson 用于将 Java 对象和 JSON 相互转换的工具类)
        ObjectMapper objectMapper = new ObjectMapper();
        
        // 设置日期格式为 "yyyy-MM-dd HH:mm:ss",即:2024-10-15 12:34:56
        objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
        
        // 将配置好的 ObjectMapper 设置到消息转换器中
        converter.setObjectMapper(objectMapper);
        
        // 将自定义的消息转换器添加到转换器列表的最前面
        // 这样 Spring MVC 会优先使用这个自定义的转换器
        converters.add(0, converter);
    }
}

详细解释

  1. @Configuration 注解

    该注解表明 WebConfig 是一个配置类,Spring 会在启动时自动加载该类并执行其中的配置逻辑。

  2. WebMvcConfigurer 接口

    这是一个用于扩展和自定义 Spring MVC 行为的接口,不会覆盖 Spring 的默认配置。这里实现了 extendMessageConverters 方法,主要是为了自定义消息转换器。

  3. extendMessageConverters(List<HttpMessageConverter<?>> converters) 方法

    • 这个方法允许在 Spring MVC 的默认消息转换器列表中插入或替换自定义的消息转换器。
    • converters 参数是 Spring MVC 默认提供的消息转换器列表。
  4. MappingJackson2HttpMessageConverter

    这是一个专门用于将 Java 对象转换为 JSON 格式,以及将 JSON 解析为 Java 对象的消息转换器。Spring 默认使用 Jackson 作为 JSON 序列化和反序列化的工具。

  5. ObjectMapper

    • Jackson 的核心类,用于配置和执行对象和 JSON 之间的相互转换。
    • 在这里通过 setDateFormat 方法设置了全局的日期格式,所有涉及日期的字段都会被转换为 yyyy-MM-dd HH:mm:ss 格式。
  6. converters.add(0, converter)

    • 该语句将自定义的消息转换器添加到 converters 列表的最前面。这样可以保证 Spring 优先使用我们自定义的转换器来处理请求和响应中的 JSON 数据。
相关推荐
cyforkk15 小时前
Spring 异常处理器:从混乱到有序,优雅处理所有异常
java·后端·spring·mvc
OEC小胖胖1 天前
Next.js数据获取入门:`getStaticProps` 与 `getServerSideProps`
前端·前端框架·web·next.js
GM_8281 天前
【Go项目基建】GORM框架实现SQL校验拦截器(完整源码+详解)
sql·golang·拦截器·gorm·慢查询·持久层基建
借你耳朵说爱你2 天前
浅拷贝和深拷贝两种不同的对象复制
vue·web
诗人不说梦^2 天前
[CISCN2019 总决赛 Day2 Web1]Easyweb
web·ctf
OEC小胖胖2 天前
Next.js 介绍:为什么选择它来构建你的下一个 Web 应用?
开发语言·前端·web·next.js
OEC小胖胖3 天前
页面间的导航:`<Link>` 组件和 `useRouter`
前端·前端框架·web·next.js
Cloud-Future3 天前
Spring MVC 处理请求的流程
java·spring·mvc
练习时长两年半的Java练习生(升级中)4 天前
从0开始学习Java+AI知识点总结-30.前端web开发(JS+Vue+Ajax)
前端·javascript·vue.js·学习·web
科技树支点5 天前
无GC的Java创新设计思路:作用域引用式自动内存管理
java·python·go·web·编程语言·编译器