-
[Spring] DTO 클래스에 기본 생성자가 없을 때 발생하는 에러 해결방법개발 지식/Spring 2023. 11. 21. 17:30
문제 상황
- DTO 클래스에 기본 생성자가 없어서 다음과 같은 에러가 뜨는 상황
여기에 사진 넣기!
해결 방안
- 빌드 설정을 인텔리제이에서 gradle로 변경하니 해결되었다.
- 결론 기본생성자가 없어도 정상적으로 매핑된다.
동작 원리
- Spring Boot가 JSON을 매핑하는 구현체로 Jackson 라이브러리의 ObjectMapper를 사용하는데 이때 getter, setter의 prefix를 제거하고 필드명과 비교하여 리플렉션을 이용해 값을 할당하고 이 과정에서 기본 생성자가 필요하다.
- 하지만 매핑이 필요한 필드를 가진 생성자에 @JsonCreator 애너테이션을 사용하게 되면 Jackson이 이를 인식해서 필드를 매핑할 수 있게 한다.
- 생성자가 한 개인 경우에는 해당 애너테이션은 생략이 가능하다.
- 해당 라이브러리는 com.fasterxml.jackson.module:jackson-module-paremeter-names 경로에 있다.
- 이 덕분에 DTO도 불변 객체로 만들 수 있게 되었다.(기존에는 왜 final을 사용하지 못하는가?? 그리고 불변객체일때 장점은??)
추가 방안
- 빌드 방법을 그대로 인텔리제이로 하는 경우
https://prospective-developer-seo.tistory.com/120
[Spring] @RequestBody와 기본 생성자
- 매핑하는 과정에서 getter 또는 setter의 이름을 사용하여 매핑하기 때문에 getter만 있어도 된다.(둘 다 없는 경우 에러 발생) - 코드로 자세한 동작을 보려면 아래 블로그를 참고! 참고 자료 https://b
prospective-developer-seo.tistory.com
@RequestBody와 기본 생성자의 관계에 대한 자세한 내용은 이곳을 참고하기!
참고 자료
https://bjp5319.tistory.com/53
@RequestBody는 기본 생성자가 필요없다.
나는 지금까지 @RequestBody를 통해 JSON 요청이나 응답할 때, 기본 생성자가 꼭 필요하다고 알고 있었다. 아래 코드는 위 조건을 반영한 코드이다. @Getter public class HelloDto { private String name; private boolea
bjp5319.tistory.com
'개발 지식 > Spring' 카테고리의 다른 글
[Spring] build.gradle에 추가하는 라이브러리 공식문서 확인하는 방법 (0) 2023.12.27 [Spring] 필드가 1개인 DTO는 기본 생성자가 없을 시 에러가 발생한다. (0) 2023.12.27 [Spring] @RequestBody와 기본 생성자 (1) 2023.11.21 [Spring] 데이터 바인딩(Data Binding)과 이와 관련된 예외 (0) 2023.11.20 [Spring] 의존관계 자동 주입(@Autowired) (2) 2023.11.15