2015-03-21 18 views
5

ho una dipendenza circolare che sto lottando per risolvere in questo momento Prendere queste due classi - caldaia codice piastra rimosso in seguito a scopo dimostrativoJackson circolari Dipendenze

Classe 1

@Entity 
@Table(name = "T_CREDENTIAL") 
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE) 
@JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class, property="@id") 
public class Credential implements Serializable { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 


    //Removed @JsonIgnore as want to disable certain fields if no credentials are available  
    //Also fetch this in an eager fashion instead of lazily loading it 
    @OneToMany(mappedBy = "credential",fetch=FetchType.EAGER) 
    private Set<UserTask> userTasks = new HashSet<>(); 

    .... 

    ..... 

Classe 2

@Entity 
@Table(name = "T_USERTASK") 
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE) 
@JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class, property="@id") 
public class UserTask implements Serializable { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = -8179545669754377924L; 


    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "id") 
    private Long id; 


    @ManyToOne(fetch=FetchType.EAGER) 
    @NotNull(message = "Credential must not be null") 
    private Credential credential; 

Purtroppo ho casi di utilizzo in cui UserTask deve caricare le credenziali e i casi in cui le credenziali devono caricare le Usertasks

L'annotazione @JsonIdentityInfo sembra fare il suo lavoro Se carico tutti i UserTasks, carica il primo userTask e le sue credenziali, ma poi quell'oggetto credenziale caricherà anche qualsiasi UserTasks assegnato a quella credenziale. Questo poi incontra il nuovo @Id o un userTask che ora lo carica con le credenziali anziché come 2 attività degli utenti

Qualche idea su cosa posso fare per aggirare questo problema?

Acclamazioni Damien

--Question Aggiornamento Ho aggiornato il mio codice ora di utilizzare le nuove annotazioni come detto da altri utenti

Classe 1

@Entity 
@Table(name = "T_CREDENTIAL") 
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE) 
public class Credential implements Serializable { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = -8696943454186195541L; 



    //Removed @JsonIgnore as want to disable certain fields if no credentials are available  
    //Also fetch this in an eager fashion instead of lazily loading it 
    @OneToMany(mappedBy = "credential",fetch=FetchType.EAGER) 
    @JsonManagedReference("credential") 
    private Set<UserTask> userTasks = new HashSet<>(); 
    .... 
.... 

Classe 2

@Entity 
@Table(name = "T_USERTASK") 
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE) 
public class UserTask implements Serializable { 


    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "id") 
    private Long id; 

    @ManyToOne(fetch=FetchType.EAGER) 
    @NotNull(message = "Credential must not be null") 
    @JsonBackReference("credential") 
    private Credential credential; 
.... 
.... 

Queste classi ora funziona e non ha dipendenze circolari Tuttavia, quando faccio una query ora per ottenere i miei usertasks o una singola attività, l'oggetto credenziale non viene restituito anche se non ho specificato l'annotazione @jsonIgnore. Qualche idea su cosa sta causando questo?

+1

Jackson h come alcune annotazioni per la gestione di riferimenti circolari. Vedi [JsonManagedReference] (http://fasterxml.github.io/jackson-annotations/javadoc/2.5/com/fasterxml/jackson/annotation/JsonManagedReference.html) e [JsonBackReference] (http://fasterxml.github.io/ jackson-annotations/javadoc/2.5/com/fasterxml/jackson/annotation/JsonBackReference.html) – kuujo

+0

Grazie kuujo - ho aggiunto quelli e sembra funzionare ma ora il mio oggetto credenziali non viene restituito dall'oggetto UserTasks sulle chiamate json. Ho aggiornato anche la domanda con questi dettagli. Qualche idea su cosa c'è qui? Non ho @JsonIgnore specificato – Damien

risposta

3

se si utilizza Jackson HttpMessageConverter, si dovrebbe verificare la loro documentazione - http://wiki.fasterxml.com/JacksonFeatureBiDirReferences

Si dovrebbe aggiungere annotazioni illustrato di seguito:

public class NodeList 
{ 
    @JsonManagedReference 
    public List<NodeForList> nodes; 
} 

public class NodeForList 
{ 
    public String name; 

    @JsonBackReference public NodeList parent; 

    public NodeForList() { this(null); } 
    public NodeForList(String n) { name = n; } 
} 
+0

Grazie Nikolay- ho aggiunto quelli e sembra funzionare ma ora il mio oggetto credenziali non viene restituito dall'oggetto UserTasks su chiamate json. Ho aggiornato anche la domanda con questi dettagli. Qualche idea su cosa c'è qui? Non ho @JsonIgnore specificato – Damien

+1

Ciao, in tal caso se vuoi che l'oggetto 'Credential' venga serializzato in UserTask dovresti tornare a' @ JsonIdentityInfo'.Rimuovi le annotazioni '@ JsonBack' e' @ JsonManagedReference' e aggiungi '@JsonIdentityInfo (generator = ObjectIdGenerators.PropertyGenerator.class, property =" id ")' alle tue classi –

0

sono andato con l'annotazione di sotto, alla fine

@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id") 

Grazie per il vostro aiuto ragazzi

Problemi correlati