JSON在发布时递归调用对象

问题描述:

我通过Swagger测试我的应用程序,当试图发布一个包含其他对象列表的对象时,我得到一个错误java.lang.*Error。基本上,我试图写一张发票,在Swagger表单中表示为JSON,并且在填写发票的数据时,我注意到发票项目包含发票的重复字段。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; 

也许有一些问题与我的批注发票被递归调用?

你应该标注上与@JsonIgnore注释,这意味着当InvoiceItems被序列应该避免你的无限递归JSON问题就不会被序列化成JSON InvoiceItems您的发票属性:

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