2017-09-07 3 views
1

Je teste mon application via Swagger et lorsque j'essaie de publier un objet contenant une liste d'autres objets, j'obtiens une erreur java.lang.StackOverflowError. Fondamentalement, j'essaye d'écrire une facture, représentée comme JSON sous forme de Swagger, et en remplissant les données pour ma facture j'ai remarqué que l'élément de facture contient les champs dupliqués pour la facture.JSON appelle l'objet récursivement en le publiant

{ 
    "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; 

J'ai la même cartographie avec Contrepartie, mais il ne me montre pas les données de facture 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; 

Peut-être qu'il ya quelques problèmes avec mes annotations cette facture est appelée récursive?

Répondre

0

Vous devez marquer votre propriété de facture sur InvoiceItems avec l'annotation @JsonIgnore qui signifie qu'il ne sera pas sérialisé dans JSON lorsque les InvoiceItems est sérialisé qui devrait empêcher votre problème JSON infiniment récursive:

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