Administrator
发布于 2024-06-11 / 11 阅读
0
0

2024 新项目开发问题日志记录1

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时,除非是有封装对象的情况下,在遇到传入数组、集合这种时,
则需要注意入参的格式。

评论