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、参数下划线转驼峰。

猜你喜欢

转载自blog.csdn.net/feinifi/article/details/119803821