Jackson Error - InvalidDefinitionException: Direct self-reference leading to cycle
2019. 4. 16. 11:16ㆍ[개발] 기록
Direct self-reference : 자기 자신을 참조하는 멤버변수가 존재할 때 발생하는 에러
문제 상황
@Data
public class Parent {
public String message;
}
@Data
public class Child extends Parent{
public String message;
public Parent getParent() { return (Parent) this; }
}
Child childInstance = new Child();
ObjectMapper objectMapper = new ObjectMapper();
System.out.println(objectMapper.writeValueAsString(childInstance));
문제 해석
ObjectMapper 가 childInstacne를 Serialize 하려고 시도한다.
1. get 메소드를 찾는다.
2. getMessage() // from lombok
3. getParent()
이를 바탕으로 { "message" : "", "parent" : ""} 인 Json 데이터를 만드려한다.
그런데 이 때 getParent 의 반환 타입을 보니 Parent 이다.
childInstance 의 타입이 Child로 Parent 를 상속하고 있다.
여기서 사이클이 생길 수 있어서 발생하는 에러다.
문제 해결
방법1. getParent 말고 메소드 목적에 맞는 좀 더 명시적인 메소드 이름을 사용한다.
@Data
public class Child extends Parent{
public String message;
public Parent upcasting() { return (Parent) this; }
}
방법2. ObjectMapper 에 getParent가 걸리지 않도록 한다.
@Data
public class Child extends Parent{
public String message;
@JsonIgnore
public Parent getParent() { return (Parent) this; }
}
'[개발] 기록' 카테고리의 다른 글
Reactive connection with DB (0) | 2019.04.18 |
---|---|
Lombok을 사용할 때 List 타입 멤버변수 오버라이딩 (0) | 2019.04.16 |
[2019.04.06] SpringBootTest, SpringJpaTest (0) | 2019.04.06 |
[2019.04.06] Mock, MockBean (0) | 2019.04.06 |
[2019.03.30] dSYM, Source map (0) | 2019.03.30 |