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 |
다시 실행해보면 에러없이 잘 작동한다.
'IT기술 > JAVA' 카테고리의 다른 글
REST API 이해하기 (0) | 2023.06.30 |
---|---|
[Java] Enum 상수 집합 사용하기 (0) | 2023.06.28 |
[Java] 파일생성 및 파일읽기 InputStream, OutputStream 사용방법 (0) | 2023.06.21 |
[JAVA] 상속 (Inheritance), extends와 implements (0) | 2023.05.26 |
[JAVA] String의 빈값 구분하기 null check (0) | 2023.05.24 |