JSON在发布时递归调用对象
问题描述:
我通过Swagger测试我的应用程序,当试图发布一个包含其他对象列表的对象时,我得到一个错误java.lang.StackOverflowError。基本上,我试图写一张发票,在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;