Spring에서 Js에서 데이터 받을 때 START_OBJECT token 에러 문제

주의

이 문건은 과거 Hexo 블로그 (2018-04-26) 에서 이동된 문서입니다.

시간이 지남에 따라 최신 기술과 다를 수 있으니 주의 바랍니다.



JS에서 값을 받으려 했더니…

SpringBoot를 사용하여 JS에서 Json으로 서버측에 데이터를 보냈더니 아래와 같은 에러가 발생하였습니다.

Could not read JSON: Can not deserialize instance of hello.Country[] out of START_OBJECT token

사실 제 로그는 아니고 검색해서 나온 로그입니다… (저장 해두는 것을 깜빡하여…)

저의 경우 이 문제가 일어난 케이스는 제가 개발 중인 사내정보시스템 기능 중 하나인 회의록 저장 기능이었습니다.
먼저 JS 단에서 전송하는 데이터는 아래와 같습니다.

jsonObj = {
  meetingType: $('#meetTypeSelector').val(),
  startDate: $('#startDate').val(),
  member: $('#userSelector').val(),
}
jsonObj.boardDTO = {
  title: $('#title').val(),
  content: CKEDITOR.instances.editor1.getData(),
}

저기 데이터 중에 member라는 값은 Select2의 값인데 이게 문제였습니다.
위의 값을 받는 데이터 중에 DTO를 사용하는데 아래와 같습니다.

@Getter
@Setter
@Accessors(chain = true)
public class MeetingLogDTO {
    private DefaultBoardDTO boardDTO;
    private MeetingLogType meetingType;
    private String startDate;
    private String member; //문제코드
    //private List<String> member; //수정코드 (정상 동작)
}

위 코드는 일부 코드이며, 참고용입니다.
주석은 제가 수정한 것이고, 기존에는 String을 사용하였는데 이 부분이 문제였습니다.
JS에서 보낸 member의 경우 String으로 오는줄 착각을 하고 있었는데, log를 찍어서 보니…배열로 오고 있었습니다.
그래서 이 부분을 String -> List 으로 변환하였더니 문제가 해결 되었습니다.


결론

위 문제가 발생한 경우에는 다음 부분을 확인해 보시기 바랍니다.

1. JS의 Json 전달 부분의 데이터가 배열인지 일반 문자열인지 확인할 것.
2. Back-end 부분에서 Json을 받는 부분인 DTO(또는 매핑 객체)의 값의 자료형을 확인해 볼것


Written by@MHLab
개발은 언제나 취미로만...
Let that be a lesson.