Java Spring - HttpClient назначает дополнительное поле при сериализации ResponseEntity - PullRequest
0 голосов
/ 29 марта 2020

Короче проблема в том, что у меня есть следующее тело для HttpResponse:

{"mammalList":[{"id":11,"details":{"id":3,"name":"Kangaroo","description":"Example",
"image":null},"age":40,"hasHooves":true,"hasPlacenta":false,"name":"Kangaroo"}]}

В конце есть еще одно поле "name": "Kangaroo"

Млекопитающее: Mammal(Long id, Details details, int age, boolean hasHooves, boolean hasPlacenta) с подробностями Details(Long id, String name, String description, String image)

Скажем, у меня есть отображение Get animals/all/mammals

У меня есть метод get, который сначала создает HttpRequest

public static <E> E get(String path, Class<E> responseType) {
        // Build HTTP request
        HttpRequest request = HttpRequest.newBuilder().uri(URI.create(host + "/" + path))
                .setHeader("Content-Type", "application/json").GET().build();

, затем пытается получить ответ

HttpResponse<String> httpResponse = client.send(request, HttpResponse.BodyHandlers.ofString());

/ * это клиент - приватный статус c final HttpClient client = HttpClient.newHttpClient (); * /

Используя бин и аннотации, я получаю метод, связанный с animals/all/mammals, и в конце метода возвращаю следующее:

    return ResponseEntity.ok(new MammalResponse(responseList));

(MammalResponse - класс, содержащий только Млекопитающее, конструкторы, геттер и сеттер)

Отладчик в конце метода показывает следующее: (что является ожидаемым)

responseList = {ArrayList@10790}  size = 1
 0 = {Mammal@10792} 
  age = 40
  hasHooves = true
  hasPlacenta = false
  id = {Long@10793} 11
  details = {Details@10794} 
   id = {Long@10795} 3
   name = "Kangaroo"
   description = "Example"
   image = null

Проблема в том, что на когда я перехожу на следующую строку метода get , у меня есть следующее тело для HttpResponse:

{"mammalList":[{"id":11,"details":{"id":3,"name":"Kangaroo","description":"Example",
"image":null},"age":40,"hasHooves":true,"hasPlacenta":false,"name":"Kangaroo"}]}

В конце есть еще одно поле "name": "Kangaroo" Млекопитающий объект не имеет атрибута name, поэтому его нельзя десериализовать, и все идет вниз.

Любая идея, почему он добавляет этот дополнительный атрибут в конце сериализованной строки «Млекопитающее» и как я могу предотвратить это?

Редактировать: если я добавлю больше млекопитающих в базу данных, то каждый из них будет в списке mammalList с name из объекта Details, помещенного в конце концов.

Ответы [ 2 ]

0 голосов
/ 29 марта 2020

Благодаря @ ganîgan Ion это исправлено!

У меня был метод getName () в Mammal, и именно поэтому имя было введено дважды. Когда я закомментировал это, получение млекопитающего из базы данных работает как положено.

Опять же, благодаря @ Ţîgan Ion. Если вы напишите это как ответ, я отмечу это как правильный.

0 голосов
/ 29 марта 2020

Ваше описание "какой службы" вы вызываете, чтобы получить HTTPResponse, далеко не завершено. Это ваш собственный сервис?

В любом случае, быстрое решение состоит в том, чтобы аннотировать ваш класс Mammal с помощью @JsonIgnoreProperties.

import com.fasterxml.jackson.annotation.JsonIgnoreProperties

@JsonIgnoreProperties
class { ... }

С этой аннотацией неизвестные поля больше не сделают вашу программу go "скоростной".

...