기타

HttpMediaTypeNotSupportedException: Content type 'application/json;charset=UTF-8' not supported

나는시화 2025. 3. 26. 22:30

원인. 

ajax로 requestBody를 서버에 넘겨주려고 할 때 발생한 오류. 

jackson 라이브러리는 이미 추가했는데 계속 발생한다. 

결론부터 말하면 jacksonget으로 시작하는 메서드 때문에 발생한 오류! 

 

@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으로 시작하는 메서드가 있으면 jacksongetter로 인식하기 때문에 nationLibSearchQueryParams 프로퍼티에 대응하는 setter를 찾는 과정에 생기는 오류이다. 


해결방법

간단하게 메서드 이름을 변경하여 해결 완료함. 

 


추가로 json 타입의 데이터를 requestBody로 매핑할 때 순서가 

1. 기본 생성자로 객체 생성 

2. setter로 필드 값 매핑

 

그래서 처음에는 상속 관계인 부모 클래스와 조상 클래스에 문제가 아닐까 생각함.

기본 생성자가 잘 만들어지는 지도 확인이 필요.