@RequestBody List<Dto> 받기 + 매핑오류 MismatchedInputException

Juseong Han·2023년 6월 14일
1

Controller에서 List형식의 json 데이터를 받으려면 간단하게 @RequestBody Dto 내부에 리스트 Dto가 있으면 된다.

public class Dto {
  private String name;
  
  private String age;
  
  // 자기자신을 List로
  private List<Dto> dtoList;
}

이 떄 클라이언트에서는 다음과 같이 전송해야한다. dtoList: 를 빠뜨리지 않도록 주의한다.

{
  "dtoList": [
    {
      "name": "han",
      "age": 29
    },
    {
      "name": "kim",
      "age": 31
    }
  ]
}

여기까지는 나도 아주 오래 사용했던 방식인데 한가지 문제가 생겼었다. 갑자기 바인드 오류가 나오는것..

cannot deserialize from Object value (no delegate- or property-based Creator); nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException

이는 Dto 내부에 String 또는 Integer 하나만 존재할때인데(아마 다른 Wrapper class도 전부 해당될 것으로 보인다. Long같은거) Springboot 기본 바인딩인 jackson-databind에서 String, Integer 타입의 List는 jsonArray가 아닌 그냥 array를 지원하기 때문이었다..

그렇기에 Dto에 String 또는 Integer 필드 하나만 존재한다면

public class Dto {
	private String name;
    private Integer age;
    private List<Child> child;
}

public class Child {
	private String name;
}

이러한 경우에

{
  "name": "han",
  "age": 29
  "child": [
    {
      "name": "kim"
    }, 
    { 
      "name": "han"
    }
  ]
}

왠지 이렇게 보내야할것같지만 이건 오답이고

{
  "name": "han",
  "age": 29
  "child": ["kim", "han"]
}

이렇게 보내면 된다.... 삽질하지마라.. 안녕..

이게 말이 되냐?

profile
개발이 하고 싶어요💻 개발이 너무 재밌는 Juseong입니다.🖐

1개의 댓글

comment-user-thumbnail
2023년 11월 25일

Juseong Han 님 좋은글 감사합니다. 퍼가도 될까요??

답글 달기