app开发定制Required Long parameter ‘xx‘ is not present,请求的Long类型参数不存在

目录

app开发定制关于前后端交互中传参的问题
app开发定制起因是前端需要给后端传递两个long类型的id,如果是getapp开发定制请求那没问题,app开发定制可我需要的是post请求,app开发定制现在我就来一一复现我app开发定制出错的原因,app开发定制直接看第六

第一次测试

前端是用postman传json(就是这让我入坑,坑死我了)

这个json很有问题,后面再说

{    "id1":64,    "id2":919}
  • 1
  • 2
  • 3
  • 4

后端代码

public ResponseData focus(long id1, long id2){}
  • 1

然后运行出错

//可选的长参数“id1”存在,但由于被声明为基元类型,因此无法转换为空值。考虑将其声明为对应基元类型的对象包装器java.lang.IllegalStateException: Optional long parameter 'id1' is present but cannot be translated into a null value due to being declared as a primitive type. Consider declaring it as object wrapper for the corresponding primitive type.	
  • 1
  • 2
  • 3

我就改成Long继续测试

第二次测试

最大的bug来了,类型改为了包装类

public ResponseData focus(Long id1, Long id2){}
  • 1

但是后端根本就取不到这个Long类型的id,这怎么行呢,get请求都没问题,一度想让我放弃post改用get

第三次测试

然后我就再改

//注意@RequestParam注解要有默认值或者@RequestParam(value = "id1",required = false)不然出问题public ResponseData focus(@RequestParam("id1") Long id1, @RequestParam("id2") Long id2){}
  • 1
  • 2
  • 3

错误原因

org.springframework.web.bind.MissingServletRequestParameterException: Required Long parameter 'id1' is not present
  • 1

因为后端没有得到id1这个参数,所以报错了,意思是:不存在必需的字符串参数’id1’
所以除非一定有值否则@注解要有默认值或者@RequestParam(value = “id1”,required = false)不然出问题

第四次测试

不过依旧没解决我的问题,我在网上搜索,后端不再接收两个long类型参数了,改成数组代码如下

public ResponseData focus(@RequestBody List<Long> ids){}
  • 1
{    "ids":[64,919]}
  • 1
  • 2
  • 3

不过情况依旧没有好转

org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize instance of `java.util.ArrayList` out of START_OBJECT token; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.util.ArrayList` out of START_OBJECT token at [Source: (PushbackInputStream); line: 1, column: 1]
  • 1
  • 2

第五次尝试

后来我把代码改成如下

public ResponseData focus(@RequestBody Long[] ids){}
  • 1

发生了如下错误

org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize instance of `java.lang.Long[]` out of START_OBJECT token; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.lang.Long[]` out of START_OBJECT token at [Source: (PushbackInputStream); line: 1, column: 1]
  • 1
  • 2

第六 直接看这里,没有废话

原来是前端传参的问题,我不知道这个大括号不能乱用,这个代表对象,既然是对象,那么后端存放对象的变量也得是对象,我只知道每次使用json都有个大括号,我以为是固定格式,导致我一直用错误的方法去接收前端的参数,导致大坑,既然后端要接收数组,去掉大括号就行了

//{//    "ids":[64,919]//}[64,919]
  • 1
  • 2
  • 3
  • 4

后端,只要前端传数组,下面写法都没问题,@注解一定要有

public ResponseData focus(@RequestBody Long[] ids){}public ResponseData focus(@RequestBody long[] ids){}
  • 1
  • 2

本次涉及到的两个注解@RequestParam和@RequestBody

除非一定有值否则@RequestParam注解要有默认值或者@RequestParam(value = “id1”,required = false)不然出问题(详情看第三次)
@RequestBody这是本次重点,可以作用在类上,表示类的所有方法都接收json/xml格式参数,作用在方法上,代表前端传参的类型是json或者xml,现在一般是json,所以前端传json,如果没有这个注解后端是取不到值的,为null,这一点一定要注意
前端我一窍不通,我不知道这个大括号不能乱用,这个代表对象,既然是对象,那么后端存放对象的变量也得是对象,我只知道每次使用json都有个大括号,我以为是固定格式,导致我一直用错误的方法去接收前端的参数,导致大坑,既然后端要接收数组,去掉大括号就行了
@ResponseBody与之正好相反,一个是接收一个是返回,这是代表返回json格式的数据,也可以作用在类上和方法上

还有要注意的是对象与数组的json格式,可不能一上来就大括号{},通过这次试错,使我对json的理解更加深入,也让我更加理解@RequestBody这个注解,这也算是一大收获吧

--------------------------------------------//对象传输格式,属性一定要加双引号{	"id":"123",	"name":"xiao"}--------------------------------------------//普通数组[123,34,67]--------------------------------------------//字符串数组["小明","小刚","小陈"]--------------------------------------------//对象数组[	{		"id":"123",	    "name":"xiao"	},	{		"id":"456",	   "name":"ming"	   }]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发