Java控制器仅通过JSON从Set中获取第一项

时间:2018-12-20 14:39:03

标签: java json spring-boot jackson

试图保存一对多JPA关系。我已经编写了一个自定义控制器。我只获得giftSet中的第一个ID,而不是所有ID。我简化了代码。

我的帖子请求-

{
  "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。之后,在创建“假日”时,我还要添加GiftSet的详细信息。

在调试模式下,我在giftSet中仅看到ID 1,而没有看到ID 1和33。 注意-将设置更改为列表不是一个选项。

1 个答案:

答案 0 :(得分:0)

简介

我看到2个问题,最后一个可能是问题。

  1. 为了使反序列化能够在JSON上运行,您缺少设置器/获取器。
  2. 您的有效负载似乎对我不起作用。

正如评论中提到的豆蔻一样,您也可以使用@JsonAutoDetect(fieldVisibility = Visibility.ANY)-但我尚未对此进行测试。

最后,如果从Java转换回JSON,也要小心使用循环引用。我看到一个假期有一组giftSet,但是giftSet指向一个假期。 如果gitset指向同一个父母假期,则这是一个循环引用,将崩溃。

字母和二传手

您的问题是您缺少getter和setter。 使用lombok并添加@data批注或添加getter和setter。

@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
      }
    }
  ]
}

快速测试

我做了一个快速测试,以了解有效载荷应该是什么样子。

@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;
    }