jackson 과 no argument constructor

jinwook han·2020년 11월 2일
0

요약

jackson을 사용하여 json을 객체로 바꿀 때, 객체의 no argument constructor(기본 생성자)는 필수인가?

→JsonProperty를 쓰지 않는 이상, no argument constructor는 필수다.

코드 돌린 결과

1. no argument constructor 없을 때 에러가 난다.

no argument constructor가 없는 클래스

→ 에러가 난다.

no argument constructor 추가한다.

→ 성공적으로 json이 객체로 변환되었다.

2. jsonProperty를 사용하면, no argument constructor가 필요하지 않다.

@JsonProperty를 생성자 파라미터에 붙인다.

→ 성공적으로 json이 객체로 변환되었다.

주의: jsonProperty를 사용하더라도, Nulls_As_empty 전략을 사용하고, 필드 중 bean이 있다면, no argument constructor가 필요하다.

Nulls_As_empty 전략을 사용하고, 필드에 bean(임의로 만든 객체)가 있는 경우:

-> Nulls.AS_EMPTY 전략을 사용하고 있다. 그리고 Outer class는 Inner class라는 bean을 필드로 가지고 있다.
deserializing 과정에서 에러가 나타났다.

deserialize 되어야 하는 필드 객체에 no argument constructor를 추가한다.

-> deserialize 되어야하는 필드 객체(inner class)에 no argument constructor를 추가한다.
성공적으로 json에서 Outer class로 객체화했다.

덧붙여서

1. 필드가 custom하게 만들어진 객체라면, BeanDeserializer를 사용한다.(클래스 이름은 BeanDeserializerBase다)

Nulls_As_empty 전략을 사용했을 때, BeanDeserializer는 no argument constructor가 있는지 검사한다.

만약 없으면 에러를 낸다.

2. no argument constructor는 private이어도 객체로 잘 변환된다.

참고

https://github.com/FasterXML/jackson-databind/blob/a6e9b69980ee0f3cad31098ac693d914c421aa06/src/main/java/com/fasterxml/jackson/databind/deser/std/StdDeserializer.java#L1535

https://github.com/FasterXML/jackson-databind/blob/master/src/test/java/com/fasterxml/jackson/failing/AsEmptyPOJONoDefaultCtor2572Test.java
** 예제 코드는 Jackson-databind 프로젝트의 AsEmptyPOJONoDefaultCtor2572Test 코드를 바꾼 것입니다.

2개의 댓글

comment-user-thumbnail
2020년 11월 28일

왜 빈 생성자가 필요한건지에 대해서도 한번 알아보세요.
(모르시면 물어봐주시구요)

1개의 답글