1.问题场景
在前端用jQuery向后台发送json数据,然后在后台收到封装好的对象
2.代码示例
前端
$.ajax({
url:"XXXX",
data:JSON.stringify(user),//user是一个json数据
type:"XXX",
contentType: "application/json;charse=UTF-8",
success:function (data) {
},
error:function (err) {
}
});
注意
1.json数据必须用JSON.stringify()方法转换成字符串
2.contentType不能省略
后台
@RequestMapping(value = "xxxxx",method = RequestMethod.XXX)
@ResponseBody
public Msg methodName(@RequestBody User user) {
logger.info("user:"+user);
return Msg.success();
}
注意
@RequestBody不可以省略
3.spring mvc封装json数据的原理分析
首先通过@RequestBody表明这个方法的参数应该被request的body绑定,即我们从前端传过去的json数据。而这个转换器就是:org.springframework.http.converter.HttpMessageConverter的一个实现类。在这里用的是阿里的fastjson来取代spring默认的Jackson进行数据绑定。(用fastjson最直观的优势就是如果属性为空就不会将其转化为json,数据会简洁很多)
第一步:在mvc配置文件中配置fastjson
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter4"/>
</mvc:message-converters>
</mvc:annotation-driven>
第二步:断点追踪请求的处理过程
请求在com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter4#readInternal方法中进行处理。读取了请求的body内容,然后通过JSON.parseObject返回目标对象
protected Object readInternal(Class<? extends Object> clazz, //
HttpInputMessage inputMessage //
) throws IOException, HttpMessageNotReadableException {
InputStream in = inputMessage.getBody();
return JSON.parseObject(in, fastJsonConfig.getCharset(), clazz, fastJsonConfig.getFeatures());
}