기타
HttpMediaTypeNotSupportedException: Content type 'application/json;charset=UTF-8' not supported
나는시화
2025. 3. 26. 22:30
원인.
ajax로 requestBody를 서버에 넘겨주려고 할 때 발생한 오류.
jackson 라이브러리는 이미 추가했는데 계속 발생한다.
결론부터 말하면 jackson은 get으로 시작하는 메서드 때문에 발생한 오류!
@Getter
@Setter
public class RecommendSearchRequest extends BookSearchRequest {
private String rcmdTnY; // 추천년월
private String rcmdTnM; // 추천월
private Integer rcmdTnYm; // 추천연월
private Long homepageSn;
private String homepageSns;
public void initRcmdTnYm() {
LocalDate now = LocalDate.now();
String nowStr = StringUtil.convertLocalDateToString(now, "yyyyMMdd");
this.rcmdTnM = nowStr.substring(4, 6);
this.rcmdTnY = nowStr.substring(0, 4);
this.rcmdTnYm = Integer.parseInt(nowStr.substring(0, 6));
}
// 이 아래 메서드가 문제!!
public MultiValueMap<String, String> getNationLibSearchQueryParams() {
MultiValueMap<String, String> queryParams = new LinkedMultiValueMap<>();
// API 요청을 위한 startRowNumApi, endRowNumApi 계산
if (StringUtils.hasText(this.rcmdTnY) && StringUtils.hasText(this.rcmdTnM)) {
YearMonth ym = YearMonth.of(Integer.parseInt(this.rcmdTnY), Integer.parseInt(this.rcmdTnM));
LocalDate startDate = ym.atDay(1);
LocalDate endDate = ym.atEndOfMonth();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
queryParams.add("start_date", startDate.format(formatter));
queryParams.add("end_date", endDate.format(formatter));
}
queryParams.add("Key", getKey());
return queryParams;
}
public RecommendSearchRequest() {
}
}
get으로 시작하는 메서드가 있으면 jackson이 getter로 인식하기 때문에 nationLibSearchQueryParams 프로퍼티에 대응하는 setter를 찾는 과정에 생기는 오류이다.
해결방법
간단하게 메서드 이름을 변경하여 해결 완료함.
추가로 json 타입의 데이터를 requestBody로 매핑할 때 순서가
1. 기본 생성자로 객체 생성
2. setter로 필드 값 매핑
그래서 처음에는 상속 관계인 부모 클래스와 조상 클래스에 문제가 아닐까 생각함.
기본 생성자가 잘 만들어지는 지도 확인이 필요.