ObjectMapper 사용시 주의점
<개요>
- 내가 사용하는 Dto에 실제 Json필드값과 연관이 없는 getter가 존재한다면
- HttpMessageNotReadableException을 만난적이 있다면
- 이전 글에서 살펴본 Ser/DeSer 와도 연관이 있다.
<내용>
- 현재 사용중인 Dto는 아래와 같은 Abstract class를 상속하도록 되어있다.
public abstract class AbstractCommonTable {
public abstract Integer getPrimaryKey();
public boolean checkAvailablePrimaryKey(){
return //condition;
}
public boolean checkNotAvailablePrimaryKey(){
return !checkAvailablePrimaryKey();
}
}
- 여러 비지니스 Dto 에 필요한 PK의 필드명은 각각 다르지만, 이를 활용한 공통로직을 구성할때 필요하여 작성했다.
- 일반적으로 Controller 레벨에서 혹은 이를 테스트하는 코드를 작성할때 우리는 객체를 Json string으로 변환하여 사용한다.
- 여러 종류의 오픈소스가 존재하는 데 여기서는 jackson을 사용하였다. (Spring default)
ObjectMapper mapper = new ObjectMapper();
String str = mapper.writeValueAsString(productInsightDto);
<현상>
- 그러나 Controller Testcase를 수행하였을때 org.springframework.http.converter.HttpMessageNotReadableException 을 만나게 된다.
- 구글링으로 통해서 다양한 원인을 찾을 수 있는데 정리해보면 Json 형식 오류이다.
a. body형식 -> JSON
b. LocalDateTime -> module등록, @JsonSerialize, @JsonFormat/@DateTimeFormat 등등
- 내가 발생했던 오류는 getPrimaryKey()라는 메소드가 실제 Json Data Format과 불일치하기 때문에 발생하는 것으로
@JsonIgnoreProperties({"primaryKey"})
를 설정해주면 간단히 해결된다.
- 추가 : 간혹 application.yml에 설정해둔 내용이나 나의 의도와는 관계없이 동작하는 경우가 있는데 ObjectMapper가 여러개 만들어있지는 않은지 확인한다.
applicatoin.yml에 설정하는 내용은 Spring에서 자동생성하는 ObjectMapper의 설정으로, 본인이 별도의 Bean으로 생성하였다면 따로 관리해주어야 한다.
<참조>
https://stackoverflow.com/questions/51261809/spring-boot-jackson-non-null-property-not-working