Spring MVC 消息转换器

消息转换器是Spring MVC中非常有用的特性,它简化了处理不同数据格式的请求和响应的过程。

当客户端(例如浏览器)向服务器发送请求时,服务器需要将请求消息转换成服务器应用程序可以理解的形式,同样当服务器向客户端发送响应时,服务器应用程序需要将响应消息转换成客户端可以理解的形式。Spring MVC 使用消息转换器(Message Converter)来完成请求消息和响应消息的转换过程。

消息转换器是Spring MVC框架中的一种功能强大的机制,它可以将HTTP请求和响应中的消息体与Java对象之间进行转换。具体来说,它可以将请求消息中的数据(例如JSON、XML、form表单等)转换成Java对象,并将Java对象转换成响应消息中的数据。

Spring MVC支持多种消息转换器,每种转换器负责实现特定的数据格式转换。以下是一些常见的消息转换器:

下面是一个示例,演示如何在Spring MVC中添加自定义消息转换器:

  • StringHttpMessageConverter:将请求消息和响应消息转换成String类型。
  • MappingJackson2HttpMessageConverter:将JSON数据与Java对象之间进行转换,使用Jackson库实现。
  • MappingJackson2XmlHttpMessageConverter:将XML数据与Java对象之间进行转换,使用Jackson库实现。
  • FormHttpMessageConverter:将表单数据与Java对象之间进行转换,支持application/x-www-form-urlencoded和multipart/form-data格式。
  • ByteArrayHttpMessageConverter:将字节数组与Java对象之间进行转换。
  • Jaxb2RootElementHttpMessageConverter:将XML数据与Java对象之间进行转换,使用JAXB库实现。
  • 在Spring MVC中,消息转换器在处理请求和响应时自动触发。当请求到达控制器方法时,Spring MVC会检查请求中的Content-Type,并查找适合该Content-Type的消息转换器进行转换。同样,当控制器方法返回响应时,Spring MVC会根据客户端请求的Accept头部信息,查找适合的消息转换器将Java对象转换成响应消息的数据格式。

    你可以通过以下方式自定义消息转换器:

  • 注册自定义的转换器:在Spring MVC配置文件或Java配置中注册自定义的消息转换器。
  • 修改默认转换器列表:可以通过修改WebMvcConfigurer的configureMessageConverters方法来修改默认的消息转换器列表。
  •  /**
         * 扩展Spring MVC框架的消息转化器
         * @param converters
         */
        @Override
        protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
            log.info("扩展消息转换器...");
            //创建一个消息转换器对象
            MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
            //需要为消息转换器设置一个对象转换器,对象转换器可以将Java对象序列化为json数据
            converter.setObjectMapper(new JacksonObjectMapper());
            //将自己的消息转化器加入容器中
            converters.add(0,converter);
        }
    }

    对象类

        

/**
 * 对象映射器:基于jackson将Java对象转为json,或者将json转为Java对象
 * 将JSON解析为Java对象的过程称为 [从JSON反序列化Java对象]
 * 从Java对象生成JSON的过程称为 [序列化Java对象到JSON]
 */
public class JacksonObjectMapper extends ObjectMapper {

    public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";
    //public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
    public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm";
    public static final String DEFAULT_TIME_FORMAT = "HH:mm:ss";

    public JacksonObjectMapper() {
        super();
        //收到未知属性时不报异常
        this.configure(FAIL_ON_UNKNOWN_PROPERTIES, false);

        //反序列化时,属性不存在的兼容处理
        this.getDeserializationConfig().withoutFeatures(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);

        SimpleModule simpleModule = new SimpleModule()
                .addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)))
                .addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)))
                .addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)))
                .addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)))
                .addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)))
                .addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)));

        //注册功能模块 例如,可以添加自定义序列化器和反序列化器
        this.registerModule(simpleModule);
    }
}

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值