2016-10-26 4 views
1

J'ai résolu boucle récursive JSON avec @JsonIdentityInfo par le blog de Baeldung 1 (la Merci)Spring JPA bidirectionnel ne peut pas évaluer toString

Mais maintenant, une autre erreur se produit:

Method threw 'java.lang.StackOverflowError' exception. Cannot evaluate com.mezoo.tdc.model.Payment.toString() 

Voici mon objet d'enregistrement:

@Entity 
    @Table(name="Registration") 
    @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "uuid") 
    public class Registration implements Serializable { 

     /*some private variables..*/ 

     // Bidirectional relationship 
     @OneToMany(mappedBy="registration", cascade = {CascadeType.PERSIST, CascadeType.REMOVE, CascadeType.MERGE}, fetch = FetchType.LAZY) 
     private List<Payment> payment; 

       @Override 
     public String toString() { 
     return MoreObjects.toStringHelper(this) 
      .add("payment", payment) 
      .toString(); 
     } 
    } 

maintenant, objet de paiement:

@Entity 
    @Table(name="Payment") 
    @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "uuid") 
    public class Payment implements Serializable { 
     @ManyToOne 
     @JoinColumn(name = "registration") 
     private Registration registration; 

     @Override 
     public String toString() { 
     return MoreObjects.toStringHelper(this) 
      .add("registration", registration) 
      .toString(); 
     } 
    } 

C'est, ce que je vois Débogueur:

debug screenshot

S'il vous plaît, ce qui est faux et pourquoi?

+0

Ce n'est qu'une erreur d'un IDE (avertissement) – Mezoo

Répondre

1

Eh bien, je suppose que Registration.toString() imprime la représentation de chaîne de chaque paiement dans la liste, et depuis Payment.toString() comprend la représentation de chaîne de Registration, Registration.toString() est appelé à nouveau, ce qui encore une fois, et ainsi de suite à son tour appelle Payment.toString().

Essayez de retourner une chaîne vide dans Payment.toString() pour voir si le problème disparaît.

+0

Le retour d'une chaîne vide a résolu le problème. cependant, cela signifie que la méthode toString est désormais redondante. Ce problème peut-il être résolu avec une meilleure configuration de mappage JPA? J'utilise l'annotation Lombok @Data pour la méthode toString, cela pourrait-il causer le problème? –

+0

Si je comprends bien, '@ Data' implique' @ ToString', qui saisit tous les champs de la classe et les imprime dans 'toString()'. Alors oui, il est très probable que "@ Data" soit le problème ici. En ce qui concerne le mapping, à moins que vous n'ayez besoin d'une association bidirectionnelle, il n'y a rien à améliorer, c'est parfaitement valide. C'est la façon dont 'toString()' est généré qui cause des problèmes. – crizzis