Mi ci sono volute ore per capire, qual è il problema:
Ho un servizio Spring Rest e un metodo GET che restituisce un utente in formato JSON. I dati provengono dal mio database su sessionFactory.
Dopo il debug si è scoperto che il problema è legato alla mia relazione bidirezionale onetomany-manytoone.
Quindi chiamare
User user = (User) sessionFactory.getCurrentSession().load(User.class, userId);
restituisce un oggetto utente in cui user.getCity (). getSupplier () viene eseguito in una com.sun.jdi.InvocationException. Pertanto Jackson non è ovviamente in grado di serializzare. Ma cosa causa questa eccezione?
@Entity
@Table(name = "T_CITY")
public class City implements Serializable {
private static final long serialVersionUID = 1L;
@Id
private long id;
@OneToMany(mappedBy = "city", cascade=CascadeType.ALL)
private Set<User> user;
@OneToMany(mappedBy = "city", cascade=CascadeType.ALL)
private Set<Supplier> supplier;
Utente:
@Entity
@Table(name = "T_USER")
public class User implements Serializable {
private static final long serialVersionUID = 1L;
public User() {
}
@Id
private long id;
@ManyToOne
private City city;
Fornitore:
@Entity
@Table(name = "T_SUPPLIER")
public class Supplier implements Serializable {
private static final long serialVersionUID = 1L;
@Id
private long id;
@ManyToOne
private City city;
risposte:
0 per risposta № 1Come menzionato nell'altra risposta, penso che "llscopri che i tuoi problemi sono legati alle relazioni da x a x. Questo a volte può creare problemi di riferimento circolari quando si tenta di jsonificare i bean di entità.
A volte puoi evitarlo o superarlo usando le annotazioni, altre volte è necessaria una classe wrapper. Spesso scrivo solo una classe wrapper per gestire le mie transazioni JSON
Esistono molti riferimenti a questo tipo di problemi che coprono molte lingue. Ecco alcuni punti di partenza per la tua ricerca.
- Ricerca correlata a Google relativa a riferimenti circolari in oggetti entità
- Json e Java - Riferimenti circolari
- Dipendenze circolari con Jackson