0%

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

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

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

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

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

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

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

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

1
2
3
4
5
6
7
8
9
10
@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(또는 매핑 객체)의 값의 자료형을 확인해 볼것