REST / JSON - поле в ответ незаметно увеличивается браузером? - PullRequest
0 голосов
/ 02 мая 2018

Я создаю приложение JavaScript (React / и т. Д.), Которое использует ресурсы 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,
  ...

Это правильно: сущность Task с таким идентификатором существует в моей базе данных.

3. Тогда ответ JSON дается моему приложению как:

...
"tasks": [ {
  "id" : 20180501150819348,
  ...

4. Я определенно могу получить эту сущность через rest/tasks/...9347 - но, как в (2) и (3), полученный JSON-объект имеет неправильный (увеличенный) идентификатор.

Странная часть: кажется, что это происходит на уровне браузера . Когда, например, я проверяю сетевой запрос / ответ в Chrome, я вижу, что ответ raw содержит правильный идентификатор, а довольно напечатанный ответ содержит неправильный (увеличенный) идентификатор. Я проверял это как с Chrome (66.0.3359.139), так и с Firefox (59.0.3).

Однако это единственный тип сущности, который проявляет такое поведение. Я проверил все остальные типы сущностей (с идентификаторами int и long). Это поведение согласованно при нескольких перезапусках (как приложения, так и браузера).

Chrome - ответ (необработанный)

Chrome - ответ (довольно напечатанный)

1 Ответ

0 голосов
/ 02 мая 2018

У вас проблема с округлением. Номер 20180501150819347 больше Number.MAX_SAFE_INTEGER. JavaScript (и TypeScript) представляют все числа как числа с плавающей точкой, поэтому числа, превышающие эту константу, не могут быть правильно представлены. К сожалению, JavaScript не имеет чистого целочисленного типа или длинного целого.

Вы можете проверить это поведение здесь:

var num = 20180501150819347;

console.log(num);

Как видите, console.log печатает следующее число, то же самое, что происходит с вами.

Поскольку вы имеете дело с идентификаторами, я советую вам изменить тип свойства id на string. На стороне сервера это не имеет значения, но предотвратит округление на стороне клиента:

...
"tasks": [ {
  "id" : "20180501150819347",
  ...
}, ...]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...