kok202
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; }
}