본문 바로가기
  • 오늘도 한걸음. 수고많았어요.^^
  • 조금씩 꾸준히 오래 가자.ㅎ
IT기술/JAVA

[java] jackson 에러 cannot deserialize from Object value 해결방법

by 미노드 2023. 6. 23.

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `com.rest.example.domain.Ticket` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)

rest api를 테스트하는 중 다음과 같은 에러를 발견했다.

rest 소스코드

1
2
3
4
5
6
7
8
9
    @PostMapping(value= "/postticket")
    public Ticket inputTicket(@RequestBody Ticket ticket) {
        log.info("postticket");
        log.info(ticket.toString());
        Ticket tickets = new Ticket(ticket.getTno(),ticket.getOwner(), ticket.getGrade());
        log.info("posttickets");
        log.info(tickets.toString());
        return ticket;
    }
cs

requestbody param 으로 객체를 받아 바로 처리하는 과정에서 jackson 이 에러를 뱉는건데,
cannot deserialize from Object value 이 무슨 에러인지 제대로 알 수 없었다.

여러 시행착오를 겪은바 확인한 것은 jackson이 뱉는 오류인데, 
도메인인 com.rest.example.domain.Ticket 에서 생성자를 찾을 수 없다는 것이다.
자바에서 도메인 생성시 기본생성자를 알아서 찾아서 작업하는데, jackson은 기본생성자를 알아서 찾을 수 없다고 한다.
그러므로 기본생성자를 별도로 추가해줘야 한다.

Before

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Data
public class Ticket {
 
    private int tno;
    private String owner;
    private String grade;
    
    @Override
    public String toString() {
        return "Ticket [tno=" + tno + ", owner=" + owner + ", grade=" + grade + "]";
    }
    
}
 
cs

After

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Data
public class Ticket {
    private int tno;
    private String owner;
    private String grade;
 
    // 기본 생성자 선언, rest에서 사용하는데 jackson 에러 방지용으로 수동으로 선언 필요
    public Ticket() {
        
    }
    
    @Override
    public String toString() {
        return "Ticket [tno=" + tno + ", owner=" + owner + ", grade=" + grade + "]";
    }
    
}
 
cs

다시 실행해보면 에러없이 잘 작동한다.