Spring MVC使用HttpMessageConverter接口来转换HTTP请求和响应。开箱即用中包含明智的默认设置。例如,可以将对象自动转换为JSON(通过使用Jackson库)或XML(通过使用Jackson XML扩展(如果可用)或通过使用JAXB(如果Jackson XML扩展不可用))。默认情况下,字符串编码为UTF-8。

消息转换器,用在什么地方?springmvc中是如何使用的?,他有默认配置,我们如何扩展?
个人觉得这三个问题,都有答案了的话,基本在项目开发中问题不大了,当然如果想更深入的话,就得去了解springmvc的源码了。

JSON,也叫JSON字符串,,目前大多数的数据传输载体,现在http数据传输大多都是采用JNSN格式。所以我们后台写的接口返回给前端的一般都是JSON字符串。
看下面的接口:

@GetMapping(value="/{id}", method= RequestMethod.GET)
    public String getUserById(@PathVariable("id") int id) {
        User user = userService.getById(id);
        return JSONObject.toJSONString(user);
    }
    
    @GetMapping(value="/list", method= RequestMethod.GET)
    public String listUserBy() {
        List<User> user = userService.listUserBy();
        return JSONObject.toJSONString(user);
    }

这两个接口是返回给前端JSON字符串的,每一个接口方法的返回值都得定义成String,每次返回之前都得通过一些方法来将其对象转换成JSON字符串,对于程序来说,这是很麻烦的一件事情,降低了程序的可读性,增加了代码的冗余量。
所以消息转换器就诞生了,如果配置了消息转换器,那么上面的代码我们可以改成

@GetMapping(value="/{id}", method= RequestMethod.GET)
    public User getUserById(@PathVariable("id") int id) {
        return userService.getById(id);
    }
    
    @GetMapping(value="/list", method= RequestMethod.GET)
    public List<User> listUserBy() {
        return userService.listUserBy();
    }

下面这种写法是不是简单名了很多,方法返回值一看就知道,而且不用每个方法就去自己手动转一遍,

如何扩展了,如果他的默认配置项不适合我们这么办?
官方给出的例子:(在配置类中,通过@Bean注解返回自己设置属性的HttpMessageConverters对象给他即可)

import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
import org.springframework.context.annotation.*;
import org.springframework.http.converter.*;

@Configuration(proxyBeanMethods = false)
public class MyConfiguration {

    @Bean
    public HttpMessageConverters customConverters() {
        HttpMessageConverter<?> additional = ...
        HttpMessageConverter<?> another = ...
        return new HttpMessageConverters(additional, another);
    }

}

操作一把,看下他有那些属性可以给我们设置:

@Bean
    public HttpMessageConverters customConverters() {
         // 比如我们不用jackson,使用fastjson,那么我们就配置
        FastJsonHttpMessageConverter fjc = new FastJsonHttpMessageConverter();
        FastJsonConfig fj = new FastJsonConfig();
        //  WriteNullListAsEmpty  :List字段如果为null,输出为[],而非null
        // WriteNullStringAsEmpty : 字符类型字段如果为null,输出为"",而非null
        // DisableCircularReferenceDetect :消除对同一对象循环引用的问题,默认为false(如果不配置有可能会进入死循环)
        // WriteNullBooleanAsFalse:Boolean字段如果为null,输出为false,而非null
        // WriteMapNullValue:是否输出值为null的字段,默认为false。
        // 这里根据实际需求
        fj.setSerializerFeatures(SerializerFeature.DisableCircularReferenceDetect, SerializerFeature.WriteNullListAsEmpty,
                SerializerFeature.WriteNullStringAsEmpty,SerializerFeature.WriteMapNullValue);
        fjc.setFastJsonConfig(fj);
        // 其他配置,比如String消息转换器等,如果想配置,可以自己对其修改
        return new HttpMessageConverters(fjc);
    }

在Springboot中,这个消息转换器是默认开启的,其他想ssm项目中,可能就需要自己配置了。
消息转换器,用在什么地方?springmvc中是如何使用的?,他有默认配置,我们如何扩展?现在这三个问题得到答案了吧!