1.@RequestBody和@RequestParam的区别
此部分可以自行查阅。虽然问题也是出自对两者的使用不熟练
http://t.csdnimg.cn/Y6w99
http://t.csdnimg.cn/g4gPw
需要了解的区别简述:
1.RequestParam使用时是根据url上的上的key进行取值的,所以一般配合get请求使用
2.RequestBody则是会对前端传入的json数据进行封装。
问题
有某个需求,需要传入多个long类型的值,所以想直接改为前端传入数组的形式。
开始的实现为
@DeleteMapping
public DeletedVO deleteDevice(@RequestParam(value = "ids[]") List<Long> ids) {}
前端的入参url和参数格式为:
DELETE http://localhost:8081/xx/xxx/deleteDevice
{
"ids": [
"1798598451193257986",
"1"
]
}
报错信息为
org.springframework.web.bind.MissingServletRequestParameterException:
Required List parameter 'ids[]' is not present
分析原因是:使用RequestParam时,在请求的url上并未携带ids[]所命名的key。
后修改为使用@RequestBody注解
Caused by: com.fasterxml.jackson.databind.exc.MismatchedInputException:
Cannot deserialize instance of `java.util.ArrayList<java.lang.Long>` out of START_OBJECT token
分析原因为:无法反序列化为java.util.ArrayList<java.lang.Long>类型,
个人理解就是无法将传入的数据进行封装成list集合中的对象
解决
使用RequestParam时,在url路径上添加以ids为key的键值对
在使用RequestBody时,目前我实现的方法有
1.将入参的格式进行改变
[
1798598451193257986,
1
]
2.对入参的数组进行封装,即创建一个对象进行封装
总结
目前个人认为:接口上使用RequestParam注解时,一般搭配Get请求使用,因为Get请求默认
是将请求参数拼接到url上,当然,使用Get请求时,RequestBody注解也是可以使用。
至于使用RequestBody时,除非是有封装对象的情况下,在遇到传入数组、集合这种时,
则需要注意入参的格式。