springboot之Web应用程序【Spring Web MVC 之HttpMessageConverters消息转换器】
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中是如何使用的?,他有默认配置,我们如何扩展?现在这三个问题得到答案了吧!
一个相信努力就会有结果的程序员,以兴趣驱动技术!
------ CoderOu