1. @RequestBody注解
(1)@RequestBody和@RequestParam
@RequestBody 与@RequestParam()可以同时使用时,原SpringMVC接收参数的机制不变,只不过RequestBody 接收的是 请求体 里面的数据;而RequestParam接收的是 key-value 里面的参数,所以它会被切面进行处理从而可以用普通元素、数组、集合、对象等接收。
(这里涉及到前后端通信的知识,如果使用的是@RequestParam,那前端给后端传递的是键值对,后端直接就收到了这些键值对能直接用。如果用的是@RequestBody,那么前端给后端传递的就是json字符串,然后后端拿到了之后吧json字符串变成对象再用。)
注:@RequestParam就是你把形参都定义好了放在括号里面,每个形参对应着都给传值。
@RequestBody是前端在请求体里面放了一个json字符串,它是一个对象的json格式化!!!
然后后端只定义了一个(也只能有一个)对象,用这个对象来接收前端传的一堆Json请求体,把那些请求体的Json字符串转化成对象。
(2)把请求体Json字符串转化成Body对象
如果某个参数没有value的话,在传json字符串给后端时,要么干脆就不把该字段写到json字符串中;要么写value时,必须有值,null 或""都行。
2. Json个人理解
(1)序列化
Json这不仅是字符串,它是一种序列化的手段。
在Jackson的源码里面,JSON.toString(),把对象变成json字符串,是需要json序列化器的,各种序列化方式应该都有自己的序列化对象。
(2)从字符串转化成对象
从上面能看出来Json的格式,key / value格式,前面一个key的字符串,双引号打着,然后后面是value,如果有list的话,就用[{ },{ },{ }]这种中括号的格式写。
所以这种结构很容易从里面读出一对一对的key / value,然后调用要转化成的对象那个类的setter方法,把value给设进去。
(重要!!!因为要用到setter方法,之前有一次@Data结果没出来,中间有几个就设不进去值,结果把setter手动生成出来问题就解决了。)
(3) content type
一般我们在开发的过程中需要注意客户端发送请求(Request)时的Content-Type设置,特别是使用ajax的时候,如果设置得不准确,很有可能导致请求失败。比如在spring中,如果接口使用了@RequestBody,spring强大的自动解析功能,会将请求实体的内容自动转换为Bean,但前提是请求的Content-Type必须设置为application/json,否正就会返回415错误。
如果看到415错误,基本就是请求的url没有好好设置上content type参数。
3. 顺便还把Jackson看了
(1) @JsonProperty
这个解决的是java类的属性和json字符串的key这两堆的对应问题,就类似于数据库里面的字段名和java类里面的属性名的对应问题一样。
以及这个最特殊,这个是双向的,java转json和json转java都用得上。
(2)@JsonIgnore
这个只是java转json用,忽略字段
(3)@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
java转json用,格式化
(4)@JsonInclude(Include.NON_NULL)
java转json用,忽略字段
从第一个开始分一下,Jackson库解决的核心问题是java类和json 相互转化 中出现的问题。
以及大多数情况下都是把后端的类转化成json字符串的时候用的,而这种时候用到的就少了。