복붙노트

[SPRING] Jackson 순환 의존성

SPRING

Jackson 순환 의존성

나는 지금 당장 해결해야 할 순환 의존성을 가지고있다. 데모 목적으로 제거 된 보일러 플레이트 코드

클래스 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<>();

    ....

    .....

클래스 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;

불행히도 UserTask가 Usertasks를로드해야하는 자격 증명과 케이스를로드해야하는 사용 사례가 있습니다.

주석 @JsonIdentityInfo가 그 일을하는 것처럼 보입니다. 모든 UserTasks를로드하면 첫 번째 userTask와 해당 자격 증명을로드하지만 해당 자격 증명 객체는 해당 자격 증명에 할당 된 UserTasks도로드합니다. 그런 다음 새로운 @Id 또는 userTask를 만나면 2 사용자 작업 대신 자격 증명을 사용하여로드합니다.

이 문제를 피하기 위해 내가 할 수있는 아이디어가 있습니까?

건배 Damien

- 질문 업데이트 다른 사용자가 언급 한 새로운 주석을 사용하도록 코드를 업데이트했습니다.

클래스 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<>();
    ....
....

클래스 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;
....
....

이제 이러한 클래스는 작동하고 순환 종속성이 없습니다. 그러나, 지금 userTasks 또는 단일 태스크를 얻기 위해 쿼리를 수행 할 때 @jsonIgnore 주석을 지정하지 않아도 신임 오브젝트가 리턴되지 않습니다. 이 문제의 원인은 무엇입니까?

해결법

  1. ==============================

    1.Jackson HttpMessageConverter를 사용하는 경우 설명서를 확인해야합니다 (http://wiki.fasterxml.com/JacksonFeatureBiDirReferences).

    Jackson HttpMessageConverter를 사용하는 경우 설명서를 확인해야합니다 (http://wiki.fasterxml.com/JacksonFeatureBiDirReferences).

    다음에 표시된 특수 효과를 추가해야합니다.

    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; }
    }
    
  2. ==============================

    2.나는 아래의 주석과 함께 갔다.

    나는 아래의 주석과 함께 갔다.

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

    도와 줘서 고마워.

  3. from https://stackoverflow.com/questions/29177794/jackson-circular-dependencies by cc-by-sa and MIT license