最近,在做项目的时候,发现用postman发送post类型的json请求,只需要在body参数中设置json字符串,而不需要设置header参数Content-Type:application/json就可以。我一度还比较纳闷,后来猜测,后台肯定做了什么配置,当接收post请求的时候,默认增加了对字符串转json的支持。
后来,还发现一个奇怪的问题,设置参数的时候,使用下划线或者驼峰式,后台都可以解析,这个让我有些诧异,怀疑还是转换器的作用。
其实,确实是转换器的作用。这就是今天的主题:FastJsonHttpMessageConverter类,这个类并不是springboot原生自带的,它需要加入fastjson依赖,也就是阿里云仓库提供的json库。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.66</version>
</dependency>
为了验证上面所说的结论,我们准备简单的测试类:
SiteDto.java 转换对象类,负责接收参数:
package com.xxx.fastjsondemo.dto;
import java.io.Serializable;
public class SiteDto implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
private Integer id ;
private String siteCode ;
private String startDate ;
private String endDate ;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getSiteCode() {
return siteCode;
}
public void setSiteCode(String siteCode) {
this.siteCode = siteCode;
}
public String getStartDate() {
return startDate;
}
public void setStartDate(String startDate) {
this.startDate = startDate;
}
public String getEndDate() {
return endDate;
}
public void setEndDate(String endDate) {
this.endDate = endDate;
}
@Override
public String toString() {
return "SiteDto [id=" + id + ", siteCode=" + siteCode + ", startDate=" + startDate + ", endDate=" + endDate
+ "]";
}
}
TestController.java 方法控制类,接收json参数post请求类型。
package com.xxx.fastjsondemo.web;
import java.util.HashMap;
import java.util.Map;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.xxx.fastjsondemo.dto.SiteDto;
@RestController
@RequestMapping("/test")
public class TestController {
@PostMapping("/save")
public Map<String, Object> save(@RequestBody SiteDto siteDto){
Map<String, Object> result = new HashMap<String, Object>();
result.put("code", 200);
result.put("data", siteDto);
return result;
}
}
最开始直接传文本格式的json字符串,后台返回媒体类型不支持:Unsupported Media Type。
接着,修改格式,添加请求头Content-Type:application/json。就是body请求体以json格式传输,而且这里,特意给出一个带下划线的参数,看请求结果:
请求正常返回,但是下划线的参数start_date并没有被后台接收。
我们在后台添加FastJsonHttpMessageConverter类型转换器配置:
package com.xxx.fastjsondemo.conf;
import java.util.List;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
@Configuration
public class SpringMvcConfig implements WebMvcConfigurer{
public FastJsonHttpMessageConverter fastJsonHttpMessageConverter() {
return new FastJsonHttpMessageConverter();
}
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(fastJsonHttpMessageConverter());
}
}
再次发送请求,这次不仅传输文本格式,正确返回了结果,而且带下划线的参数,后台也接收并返回:
通过这个实验,我们验证了前面所说的fastjson转换器的两个功能:
1、自动给json请求添加请求头:Content-Type:application/json。
2、参数下划线转驼峰。