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中是如何使用的?,他有默认配置,我们如何扩展?现在这三个问题得到答案了吧!