FastJsonHttpMessageConverter类的作用

原文

最近,在做项目的时候,发现用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、参数下划线转驼峰。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值