如果 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 弹簧控制器错误的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ruby​​ 中解压缩大于 64 位的数字?

分子量

2022-05-05:给定一个正数num,要返回一个大于num的数,并且每一位和相邻位的数字不能相等. 返回达标的数字中,最小的那个。 来自微软。

NYOJ题目96 n-1位数

如何用java生成有规律的字符串?

C语言试题二十四之编写一个函数unsigned function(unsigned w),w使一个大于10的无符号整数,若w是n(n≥2)位的整数,则函数求出w后n-1位的数作为函数值返回。