본문 바로가기
Spring

cannot deserialize from object value 에러!

by 매트(Mat) 2021. 5. 12.

cannot deserialize from object value (no delegate- or property-based creator)

위와 같은 에러가 발생했다면 아래글을 한번 확인해보자.



Member Class

  • 먼저 데이터를 담을 모델을 정의하였습니다.
//Getter, Setter는 생략
public class Member {
    private int id;
    private String username;
    private String password;
    private String email;

    public Member(int id, String username, String password, String email) {
        this.id = id;
        this.username = username;
        this.password = password;
        this.email = email;
    }
}


HttpControllerTest

  • 다음으로 POST 방식으로 요청을 해보았습니다.
  • POST 방식은 GET 방식과 달리 Body에 데이터를 담아야 합니다.
@RestController
public class HttpControllerTest {
    ...

    @PostMapping("/http/post")
    public String postTest(@RequestBody Member m) {
        return "post 요청: " + m.getId() + ", " + m.getUsername() + ", " + m.getPassword() + ", " + m.getEmail();
    }

    ...
}


에러 발생

cannot deserialize from object value 
(no delegate- or property-based creator)
  • 친절한 스택오버플로우에서는 이 에러가 발생한 이유를 다음과 같다고 합니다.
  • jackson library가 빈 생성자가 없는 모델을 생성하는 방법을 모릅니다.


Solution

  • 그래서 모델(Member)에 따로 빈 생성자를 추가해주어야 합니다.
//Getter, Setter는 생략
public class Member {
    private int id;
    private String username;
    private String password;
    private String email;

    //기본 생성자 추가
    public Member() {

    }

    public Member(int id, String username, String password, String email) {
        this.id = id;
        this.username = username;
        this.password = password;
        this.email = email;
    }
}

 

정상 동작


위와 같이 JSON 형태로 데이터를 요청하는데 Object, 즉, Member 클래스에 딱 매핑시켜서 출력이 될 수 있는 이유는 
바로 MessageConverter(스프링 부트)가 JSON을 Object로 변환을 해주기 때문입니다.

Reference

'Spring' 카테고리의 다른 글

MVC 아키텍처  (0) 2021.05.21
intellij에서 Spring Boot + jsp 사용하기  (0) 2021.05.12
Spring Boot와 MySQL 연동 (쉬움)  (0) 2021.05.12
Spring vs Spring Boot  (0) 2021.04.15
Executing task 'Main.main()'...  (0) 2020.09.05

댓글