[SPRING] Jackson 순환 의존성
SPRINGJackson 순환 의존성
나는 지금 당장 해결해야 할 순환 의존성을 가지고있다. 데모 목적으로 제거 된 보일러 플레이트 코드
클래스 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.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.나는 아래의 주석과 함께 갔다.
나는 아래의 주석과 함께 갔다.
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
도와 줘서 고마워.
from https://stackoverflow.com/questions/29177794/jackson-circular-dependencies by cc-by-sa and MIT license