最近的一个项目中开发一个接口,因为接口参数较多并且比较长,再加上其余缘由。因此选择了以post的方式并且参数是json串的方式提交请求。遇到一些问题也很快解决了可是解决的过程当中遇到一些有用的内容,如今记录下来。java
1.postman提交json格式的请求如图,其中字段名编辑掉了: json
2.最开始后台接收的代码以下:数组
@RequestMapping(value = "/cfak", method={RequestMethod.POST}) @ResponseBody public String getCfaLabel(ServletRequest request) { ..... }
想在request获取参数,结果都是空的,确定是获取不了的,由于postman是把json串放在请求体里面。请求头里天然啥都没有了。app
3.而后改为以下代码,用@RequestBody这个注解函数
@RequestMapping(value = "/cfak", method={RequestMethod.POST}) @ResponseBody public String getCfaLabel(@RequestBody List<HashMap<String,Object>> params) { ...... }
由于以前查过若是是一个简单的json串的话传Map,我想传的是一个比较简单的数组对象,因此也没多想就用这种试试。结果可想而知仍是获取不到参数。而后网上查了一下数组的json串接收不推荐用List,直接把json数组中的属性映射成java对象而后用数组的方式接收。post
4.再次修改为如下代码:this
@RequestMapping(value = "/cfak", method={RequestMethod.POST}) @ResponseBody public String getCfaLabel(@RequestBody CfakPo[] params) { ...... }
其中CfakPo就是一个普通的POJO类:.net
public class CfakPo{ // 客户号 private String clientxxx; // 手机号 private String phoneno; // 身份证号 private String creditno; // 所须要的列 private String column; public CfakPo(String clientxxx, String column, String phoneno, String creditno){ this.clientxxx= clientxxx; this.column = column; this.phoneno = phoneno; this.creditno = creditno; } public CfakPo(){}
这里还有个小坑就是POJO类必定要有自定义的无参构造函数。当时我没注意自定义了一个构造方法,致使默认无参构造方法没了就报错,而后补上才能够。code
到这呢重要能够成功的获取到参数了,然而我并不想用这种方法,想来更简单的。因而尝试了这种彷佛更简单。orm
5.从ResponseBody中直接获取json字符串而后本身用jackson再解析:
@RequestMapping(value = "/cfak", method={RequestMethod.POST}) @ResponseBody public String getCfaLabel(@RequestBody String params) {
其中这种也是可以直接获取到一个postman中完整的json字符串的,而后能够本身再想办法解析。到这问题基本解决了,至于用哪种方法能够根据项目的具体须要来选。
可是问题也来了:为何凭借@requestBody这个注解就能够获取到json串呢,你定义String就给你返回一个String串,你定义一个Object数组就给你返回一个已经映射好的Object数组的java对象。这是怎么实现的?? 在网上找到的一篇很好的博客的内容,完成的连接以下:[ SpringMVC使用消息转换器实现请求报文和对象、对象和响应报文之间的自动转换] (https://my.oschina.net/lichhao/blog/172562) 这张图也是从博客中拉下来的(请原谅盗个图= =!),这个图展现了Spring对请求及响应请求的过程抽象:
其中主要是这个HttpMessageConverter是一个接口,他有不少实现类: 好比:StringHttpMessageConverter这个其实就是把整个的json串当作一个字符串来处理了。 还有:MappingJackson2HttpMessageConverter 这个最终仍是须要咱们添加jackson或者其余处理json的jar包 还有:XmlAwareFormHttpMessageConverter 这个是处理Xml的Converter在4.1.3中已经不推荐使用了。 至于Spring究竟在哪一个类的哪一个方法中根据各类RequestBody的类型对应各类不一样Converter暂时还没找到。。。