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 数据。
相关推荐
William_cl1 天前
C# ASP.NET MVC 数据验证实战:View 层双保险(Html.ValidationMessageFor + jQuery Validate)
后端·c#·asp.net·mvc
合作小小程序员小小店1 天前
web网页开发,在线物流管理系统,基于Idea,html,css,jQuery,jsp,java,SSM,mysql
java·前端·后端·spring·intellij-idea·web
代码栈上的思考1 天前
Spring MVC 中 @RequestMapping 路径映射与请求处理全流程
java·spring·mvc
WZTTMoon1 天前
Spring MVC 核心工作原理:DispatcherServlet 全流程深度解析
java·spring·mvc
程序员buddha2 天前
springboot-mvc项目示例代码
java·spring boot·mvc
爱隐身的官人2 天前
ctfshow-web213
web·sqlmap·ctfshow
pixle03 天前
从零学习Node.js框架Koa 【一】 Koa 初探从环境搭建到第一个应用程序
前端·node.js·web·koa.js·web全栈·node服务端框架
蒋星熠3 天前
爬虫中Cookies模拟浏览器登录技术详解
开发语言·爬虫·python·正则表达式·自动化·php·web
alien爱吃蛋挞3 天前
【JavaEE】Spring Web MVC(下)
spring·java-ee·mvc
合作小小程序员小小店3 天前
web网页开发,在线%台球俱乐部管理%系统,基于Idea,html,css,jQuery,jsp,java,ssm,mysql。
java·前端·jdk·intellij-idea·jquery·web