代码之家  ›  专栏  ›  技术社区  ›  juliam

JSON在发布对象时递归调用该对象

  •  1
  • juliam  · 技术社区  · 7 年前

    我正在通过Swagger测试我的应用程序,当我试图发布一个包含其他对象列表的对象时,我得到了一个错误java。lang.StackOverflower错误。基本上,我正在尝试编写一个发票,以夸张的形式表示为JSON,在填写发票数据时,我注意到发票项包含发票的重复字段。

    {
      "date": "2017-08-27",
      "counterparty": {
        "address": {
          "houseNumber": "string",
          "streetName": "string",
          "townName": "string",
          "zipCode": "string"
        },
        "bankName": "string",
        "bankNumber": "string",
        "companyName": "string",
        "nip": "string",
        "phoneNumber": "string"
      },
      "invoiceItems": [
        {
          "amount": 0,
          "description": "string",
          "id": 0,
          "invoice": { //SHOULD NOT BE HERE
            "id": 0,
            "date": "2017-09-07",
            "counterparty": {
              "address": {
                "houseNumber": "string",
                "streetName": "string",
                "townName": "string",
                "zipCode": "string"
              },
              "bankName": "string",
              "bankNumber": "string",
              "companyName": "string",
              "nip": "string",
              "phoneNumber": "string"
            },
            "invoiceItems": [
              {}
            ]
          },
          "numberOfItems": 0,
          "vat": "VAT_23",
          "vatAmount": 0
        }
      ]
    }
    
    @Entity
    @Table(name = "invoices")
    public class Invoice implements Comparable<Invoice> {
    
          @Id
          @GeneratedValue(strategy = GenerationType.IDENTITY)
          @Column(name = "invoice_id")
          private int id;
          @Column(name = "date")
          private LocalDate date = LocalDate.now();
          @OneToOne(mappedBy = "invoice", cascade = {CascadeType.DETACH, CascadeType.MERGE,
              CascadeType.PERSIST, CascadeType.REFRESH})
          private Counterparty counterparty;
    
          @OneToMany(mappedBy = "invoice", cascade = {CascadeType.PERSIST, CascadeType.MERGE,
              CascadeType.DETACH, CascadeType.REFRESH})
          private List<InvoiceItem> invoiceItems = new ArrayList<>();
    
    @Entity
    @Table(name = "items")
    public class InvoiceItem {
    
      @Id
      @GeneratedValue(strategy = GenerationType.IDENTITY)
      @Column(name = "item_id")
      private int id;
      private String description;
      private int numberOfItems;
      private BigDecimal amount;
      private BigDecimal vatAmount;
    
      @JoinColumn(name = "vat_code")
      @Enumerated(EnumType.ORDINAL)
      private Vat vat;
    
      @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST,
          CascadeType.REFRESH})
      @JoinColumn(name = "invoice_id")
      private Invoice invoice;
    

    我与交易对手有非常相同的映射,但它没有在JSON中显示发票数据:

    @Id
      private String nip;
      private String companyName;
      private String phoneNumber;
      private String bankName;
      private String bankNumber;
    
      @OneToOne(fetch = FetchType.LAZY, mappedBy = "counterparty", cascade = CascadeType.ALL)
      private Address address;
    
      @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST,
          CascadeType.REFRESH})
      @JoinColumn(name = "invoice_id")
      private Invoice invoice;
    

    我的注释递归调用invoice可能存在一些问题?

    1 回复  |  直到 7 年前
        1
  •  0
  •   Plog    7 年前

    您应该使用@JsonIgnore注释在InvoiceItems上标记您的Invoice属性,这意味着当InvoiceItems被序列化时,它不会被序列化为JSON,这将防止您无限递归的JSON问题:

     @Entity
     @Table(name = "items")
     public class InvoiceItem {
    
     ...
    
         @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST,
          CascadeType.REFRESH})
         @JoinColumn(name = "invoice_id")
         @JsonIgnore
         private Invoice invoice;