我正在构建一个JavaScript应用程序(React / etc。),它使用来自协同服务器的REST资源(用Spring Boot / REST / JPA编写)。
大多数情况下,我会拉动实体列表或单个实体 -
.../rest/tasks?page=0
.../rest/tasks/1234567
- 每个实体的样子:
{
"id" : 20180501150819347,
"requested" : "2018-05-01T19:08:19.353+0000",
"cancelled" : null,
"delayUntil" : null,
"started" : "2018-05-01T19:08:30.140+0000",
"ended" : "2018-05-01T19:08:31.610+0000",
"status" : "complete",
...
问题是因为某种原因," id"我的实体上的字段正在递增!
例如:
1。我发出请求:/rest/tasks
,以获取已提交任务的列表。
2。结果回复如下:
...
"tasks": [ {
"id" : 20180501150819347,
...
这是正确的:我的数据库中存在该ID的任务实体。
3. 然后,JSON响应将作为以下内容提供给我的应用程序:
...
"tasks": [ {
"id" : 20180501150819348,
...
4. 我绝对可以通过rest/tasks/...9347
检索该实体 - 但是,如(2)和(3)所示,生成的JSON对象具有不正确的(递增的)ID。
奇怪的部分是:这似乎发生在浏览器级别。例如,当我在Chrome中检查网络请求/响应时,我看到原始响应包含正确的ID,而漂亮打印的响应包含不正确的(递增的)ID。我已经通过Chrome(66.0.3359.139)和Firefox(59.0.3)对此进行了验证。
但是,这是唯一表现出这种行为的实体类型。我已经测试了所有其他实体类型(同时包含int
和long
ID)。这种行为在多次重启(应用程序和浏览器)中都是一致的。
答案 0 :(得分:0)
你有四舍五入的问题。号码20180501150819347大于Number.MAX_SAFE_INTEGER
。 JavaScript(和TypeScript)将所有数字表示为浮点数,因此,不能正确表示大于该常数的数字。不幸的是,JavaScript没有纯整数类型或长整数。
您可以在此处查看此行为:
var num = 20180501150819347;
console.log(num);

如您所见,console.log
打印下一个数字,与您相同。
当您处理ID时,我的建议是您将id
属性的类型更改为string
。它在服务器端无关紧要,但会阻止客户端出现问题:
...
"tasks": [ {
"id" : "20180501150819347",
...
}, ...]