작성
·
53
0
강의 17분쯤에 save메서드를 postman에서 테스트를 해보았는데 Internal Server Error가 떠서 확인해보니
cannot deserialize from Object value (no delegate- or property-based Creator) 에러가 뜨는 것을 확인할 수 있었습니다.
그래서 기존에
@Getter
@AllArgsConstructor
public class SaveExamScoreRequest {
private final String studentName;
private final Integer korScore;
private final Integer englishScore;
private final Integer mathScore;
}
이렇게 써져있는 코드를
@Getter
@AllArgsConstructor
@NoArgsConstructor
public class SaveExamScoreRequest {
private String studentName;
private Integer korScore;
private Integer englishScore;
private Integer mathScore;
}
이렇게 바꾸니 정상적으로 응답을 반환함을 확인할 수 있었습니다.
알아보니 해당 에러는 jackson생성자가 빈 생성자가 없는 객체를 만드는 법을 모르기 때문에 뱉는 에러라고 설명되어있어서 @NoArgsConstructor어노테이션을 추가하였고 final을 지워주었습니다.
근데 강사님의 코드는 잘 돌아가는데 왜 제 코드는 저런 에러가 발생하는지 모르겠습니다. 혹시 스프링 버전하고도 관련이 있나요? (저는 현재 spring boot 3.4.1 버전을 사용하고 있기는 합니다.)
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
김영록님, 질문해주신 내용에 대해 설명드리겠습니다.
cannot deserialize from Object value (no delegate- or property-based Creator)
오류는 일반적으로 Jackson에서 객체를 JSON으로 직렬화/역직렬화할 때 빈 생성자 (no-args constructor
)가 필요하기 때문에 발생합니다. Jackson은 객체를 인스턴스화하려면 기본적으로 빈 생성자를 필요로 합니다. 따라서, 강사님의 코드가 잘 동작하는 이유는 아마도 그의 환경이나 버전에서 다른 설정이나 지정된 추가 구성사항이 있을 수 있기 때문입니다.
스프링의 버전 차이가 이 문제에 영향을 줄 수는 있지만, 대부분의 경우에는 Jackson 설정과 관련이 있습니다. 스프링 부트 3.4.1에서 Jackson을 사용하는 경우, 기본 설정이 비슷해야 하지만 어떤 차이로 인해 이 오류가 발생할 가능성이 있습니다.
해결책으로는:
1. @NoArgsConstructor
어노테이션을 추가하여 Jackson이 빈 생성자를 통해 객체를 만들 수 있도록 하는 것이 맞는 방법입니다.
2. final
키워드를 제거하여 기본 생성자에서 필드의 초기화를 허용하는 것도 올바른 접근입니다.
또한, Jackson 모듈이나 설정을 특별히 수정한 부분이 없는지 확인해보세요. 추가적으로, Jackson의 기본 동작을 확인해주셔도 좋으며, 도큐멘테이션이나 사용 중인 라이브러리의 버전을 한 번 점검해보시는 것도 좋습니다.
위 URL을 참고하시면 JSON 테스트 관련 보다 자세한 설명을 보실 수 있습니다.
도움이 되셨길 바랍니다! 추가적인 질문이 있으면 언제든지 말씀해 주세요.