JSON 发布时递归调用对象
JSON calls object recursively when posting it
我正在通过 Swagger 测试我的应用程序,当我尝试 post 一个包含其他对象列表的对象时,我收到错误 java.lang.WhosebugError。基本上,我正在尝试写一张发票,以 Swagger 形式表示为 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;
我与 Counterparty 有完全相同的映射,但它没有显示 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 上标记您的发票 属性 这意味着当 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;
我正在通过 Swagger 测试我的应用程序,当我尝试 post 一个包含其他对象列表的对象时,我收到错误 java.lang.WhosebugError。基本上,我正在尝试写一张发票,以 Swagger 形式表示为 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;
我与 Counterparty 有完全相同的映射,但它没有显示 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 上标记您的发票 属性 这意味着当 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;