如果 JSON 字符串包含大于 10 位的数字,则 404 弹簧控制器错误
Posted
技术标签:
【中文标题】如果 JSON 字符串包含大于 10 位的数字,则 404 弹簧控制器错误【英文标题】:404 spring controller error if JSON string contains number greater than 10 digits 【发布时间】:2021-01-30 14:26:50 【问题描述】:我有一个控制器,它在请求正文中获取 json 作为字符串,如下所示
@PostMapping("/addUser")
public ResponseEntity<?> addUser (@RequestBody String userJson,HttpServletRequest request)
log.info("inside add user controller")
String responseStatus = serviceInterface.addUser (userJson);
return new ResponseEntity (responseStatus);
请求正文是
"user":
"username": "testuser",
"userId": 12345678901233,
"phonenumber": "9876756475",
"emailaddress": "test@org.com"
我面临的问题是,当 userId 属性的位数超过 10 位时,控制器返回 404 错误,请求甚至不会到达控制器,但如果我将位数减少到小于 10 位,例如 123456789,我得到了实际的预期响应。我将请求正文保留为字符串的原因是,有时请求可能是 graphql 字符串或 JSON 字符串,但这两种情况都会发生。
【问题讨论】:
【参考方案1】:这背后的可能原因是usedId
使用的数据类型。
对于int
,范围是直到2,147,483,647
尝试将数据类型更改为long
,它的范围直到9,223,372,036,854,775,807
【讨论】:
我将整个 JSON 本身作为一个字符串,知道如何将它变成 Long,因为 userId 是该 JSON 的属性吗?问题是弹簧甚至不让我得到输入,因为它甚至不让控制器内部的请求【参考方案2】:这可能是因为 java 中 Integer 的范围是 userId 字段的类型。
java 中 int 的范围是 -2,147,483,648 .. 2,147,483,647。
所以在这个范围内外尝试,检查它是否适用于该范围并且不适用于超出范围,那就是问题所在。
在这种情况下,您必须将 int 更改为 long 数据类型。
【讨论】:
我将整个 JSON 本身作为一个字符串,知道如何将它变成 Long 吗? 我建议你创建一个DTO,这样你就不必手动解析json了......这样会更方便和有效。 问题是控制器充当代理,它只是通过将输入转换为 JSON 来转发传入的请求,所以我不知道我会在请求正文中获得什么样的属性【参考方案3】:尝试将其改为 Long 类型。
int 的最大值是 2147483647 而 Long 是 9223372036854775807
【讨论】:
我尝试将其更改为 Long 类型,请求甚至没有到达控制器并直接抛出 404 spring 错误,是否有任何我不知道的 tomcat 或 servlet 配置?以上是关于如果 JSON 字符串包含大于 10 位的数字,则 404 弹簧控制器错误的主要内容,如果未能解决你的问题,请参考以下文章
2022-05-05:给定一个正数num,要返回一个大于num的数,并且每一位和相邻位的数字不能相等. 返回达标的数字中,最小的那个。 来自微软。
C语言试题二十四之编写一个函数unsigned function(unsigned w),w使一个大于10的无符号整数,若w是n(n≥2)位的整数,则函数求出w后n-1位的数作为函数值返回。