Контроллер Java получает только первый элемент из Set через JSON - PullRequest
0 голосов
/ 20 декабря 2018

Пытается сохранить отношения JPA Один-ко-многим.Я написал пользовательский контроллер.Я получаю только первый идентификатор в giftSet, а не все идентификаторы.Я упростил код.

Запрос My Post -

{
  "name": "Project 7",
  "giftSet": [
    {
        "id": "1"
    },
    {
        "id":"33"
    }
  ]
}

class Holiday{
  private String name;
  private Set<GiftConfig> giftSets;
}

class GiftSet {
  private Integer id;
  private Holiday holiday;
}

class GiftConfig {
  private Integer id;
  private String name;
}

@RequestMapping(method = RequestMethod.POST, value="/api/saveholiday")
public ResponseEntity<Map<String, Holiday>> saveHoliday(@RequestBody Holiday holiday) {
  System.out.println(holiday);
  return null;
}

Сначала я добавляю несколько GiftConfig.После этого, при создании Holiday, я также добавляю детали для GiftSet.

В режиме отладки я вижу только идентификатор 1 в giftSet, а не оба идентификатора 1 и 33. Примечание. Изменение Set to List не является опцией.

1 Ответ

0 голосов
/ 20 декабря 2018

Введение

Я вижу 2 проблемы и одну возможную последнюю проблему.

  1. Вам не хватает сеттеров / геттеров для десериализации для работы в JSON.
  2. Ваша полезная нагрузка, кажется, не работает для меня.

Как упоминалось в комментарии pcoates, вы также можете использовать @JsonAutoDetect(fieldVisibility = Visibility.ANY) - но я не проверял это.

Наконец, также будьте осторожны с циклической ссылкой, если вы конвертируете обратно из java в JSON.Я вижу, что у Праздника есть набор подарочных наборов, но подарочный набор указывает на праздник.Если набор указывает на один и тот же родительский выходной, это циклическая ссылка, которая вылетает.

Получатели и установщики

Ваша проблема в том, что вам не хватает получателей и установщиков.Либо используйте lombok и добавьте аннотацию @data, либо добавьте геттер и сеттер.

@Data
    public  static class Holiday{
        private String name;
        private Set<GiftSet> giftSets;
    }

    @Data
    public static class  GiftSet {
        private Integer id;
        private Holiday holiday;
    }

Полезная нагрузка

Я использовал следующую полезную нагрузку:

{
  "name": "HolidaySet",
  "giftSets": [
    {
      "id": 1111,
      "holiday": {
        "name": null,
        "giftSets": null
      }
    },
    {
      "id": 1112,
      "holiday": {
        "name": null,
        "giftSets": null
      }
    }
  ]
}

Quick Test

Я сделал быстрый тест, чтобы увидеть, какой должна быть полезная нагрузка.

@RequestMapping(method = RequestMethod.POST, value="/api/saveholiday")
    public ResponseEntity<Map<String, Holiday>> saveHoliday(@RequestBody Holiday holiday) throws JsonProcessingException {
        System.out.println(holiday);

        fakeItTest();

        return null;
    }

    private void fakeItTest() throws JsonProcessingException {
        ObjectMapper objectMapper = new ObjectMapper();

        Set<GiftSet> giftSets2 = new HashSet<>();
        GiftSet gg = new GiftSet();
        gg.setId(1111);
        gg.setHoliday(new Holiday());
        giftSets2.add(gg);

        GiftSet gg2 = new GiftSet();
        gg2.setId(1112);
        gg2.setHoliday(new Holiday());
        giftSets2.add(gg2);

        Holiday holiday2 = new Holiday();
        holiday2.setName("HolidaySet");
        holiday2.setGiftSets(giftSets2);

        String a = objectMapper.writeValueAsString(holiday2);
        System.out.println(a);
    }


    @Data
    public  static class Holiday{
        private String name;
        private Set<GiftSet> giftSets;
    }

    @Data
    public static class  GiftSet {
        private Integer id;
        private Holiday holiday;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...