Spring

Jackson - No serializer found Exception

구티맨 2022. 4. 25. 09:53

Jackson으로 객체를 직렬화 할 때, 아래와 같이 에러가 발생할 때가 있습니다.

직렬화를 할 때, 객체의 getter를 사용하여 변환을 하는데 이 때 에러가 발생하면 아래와 같은 예외가 발생합니다.

Exception in thread "main" com.fasterxml.jackson.databind.exc.InvalidDefinitionException: 
No serializer found for class com.example.springapp.animal.Cat and no properties discovered to create BeanSerializer 
(to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS)

 

코드를 보면 Cat 객체를 직렬화 하는데, Cat 클래스에 getter가 없습니다.

이를 해결하는 여러가지 방법을 알아보겠습니다.

public class Cat implements Walk {
    private String name;

    public Cat(String name) {
        this.name = name;
    }
}
public static void main(String[] args) throws JsonProcessingException {
        ObjectMapper objectMapper = new ObjectMapper();
        Cat cat = new Cat("kitty");
        String catString = objectMapper.writeValueAsString(cat);
        System.out.println("catString : " + catString);
}

 

방법 1. Getter 추가

@Getter
public class Cat implements Walk {
    private String name;

    public Cat(String name) {
        this.name = name;
    }
}

 

방법 2. setVisibility

private 필드에도 접근가능 하도록 설정 해줍니다.

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);

 

방법 3. @JsonAutoDetect

private 필드에도 접근가능 하도록 설정 해줍니다.

@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
public class Cat implements Walk {
   ...
}

 

방법 4. @JsonProperty

필드에 JsonProperty를 선언해 줍니다.( 직렬화를 적용하지 않을 필드에는 @JsonIgnore를 해줘야 합니다. )

public class Cat implements Walk {
    @JsonProperty
    private String name;
    ...
}