Jackson Circular Dependencies

Ich habe eine zirkuläre Abhängigkeit, die ich gerade nicht lösen kann. Nehmen Sie diese beiden Klassen - Kesselschild-Code wurde zu Demonstrationszwecken entfernt.

Klasse

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

    ....

    .....

Klasse

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

Leider habe ich Anwendungsfälle, in denen UserTask die Anmeldeinformationen laden muss, und Fälle, in denen Credential die Benutzeraufgaben laden muss

Die Annotation @JsonIdentityInfo scheint seinen Job zu erledigen. Wenn ich alle UserTasks lade, lädt sie die erste userTask und ihren Berechtigungsnachweis, aber dieses Berechtigungsnachweisobjekt lädt auch alle UserTasks, die diesem Berechtigungsnachweis zugewiesen sind. Dies trifft dann auf die neue @Id oder eine userTask, die diese nun mit dem Berechtigungsnachweis anstelle von 2 Benutzeraufgaben @ läd

Was kann ich tun, um dieses Problem zu umgehen?

Cheers Damien

- Frage Update Ich habe meinen Code jetzt aktualisiert, um die neuen Anmerkungen zu verwenden, die von anderen Benutzern erwähnt wurden.

Klasse

    @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<>();
    ....
....

Klasse

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

Diese Klassen funktionieren jetzt und haben keine zirkulären Abhängigkeiten. Wenn ich jedoch jetzt eine Abfrage zum Abrufen meiner Benutzeraufgaben oder einer einzelnen Aufgabe durchführe, wird das Anmeldeinformationsobjekt nicht zurückgegeben, obwohl die Annotation @jsonIgnore nicht angegeben ist. Irgendwelche Ideen, was das verursacht?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage