본문 바로가기
오류

Cannot construct instance of `com.example.jwt.jwt.model.User` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)

by 신방동불주먹 2023. 6. 15.

 

Jackson objectmapper의 deserialize(역직렬화, json string -> java object) 순서는

1. 대상 클래스의 기본 생성자로 객체 생성

2. 해당 객체의 setter 메소드를 활용해서 json 값을 객체에 설정

3. 만약 setter 메소드가 없다면 java reflection 패키지를 활용해서 객체에 값 설정

 

에러는 1번 항목에서 발생

@NoArgsConstructor

파라미터가 없는 기본 생성자를 만들어준다.

 

즉, @NoArgsConstructor가 붙어있는 객체의 인스턴스를 만들 때,

아래처럼 argument를 하나도 넘기지 않으며 생성자 호출을 할 수 있다.

 

하지만 만약, 항상 초기화가 필요한 final이 붙은 field가 있는데 @NoArgsConstructor을 사용한다면 compile error가 발생할 것이다.

 

대신, @NoArgsConstructor(force = true)처럼 force라는 옵션에 true 값을 주면, 모든 final fields는 0 / false / null로 초기화된다.

 

그런데 field에 final이 아닌 @NonNull 같은 제약이 있는 어노테이션이 붙어있다면,

얘는 force = true 옵션을 주어도 생성자에 들어가지 않기 때문에 나중에 프로그래머가 할당해주어야 한다.

 

hibernate Service Provider Interface 같은 특정 Java 구성에서 필요로 하고,

주로 @Data 어노테이션을 생성하는 생성자 등과 함께 사용된다.

 

@NotNull 어노테이션 삭제 후 프론트에서 유효성검증으로 처리