POST Request의 body를 Mono로 변환할때
ServerReqeust.bodyToMono(Item.class);
org.springframework.core.codec.CodecException: Type definition error: [simple type, class com.reactive.auction.domain.Item]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `com.reactive.auction.domain.Item` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
와 같은 에러가 발생할 수 있다.
이는 JackSon 라이브러리가 빈 생성자를 몰라서 발생하는 오류임.
이때 빈 생성자를 추가해주면 해당 에러를 해결할 수 있지만, 나는 도메인에 Builder를 사용해서 빈 생성자만 추가하면 에러가 발생했음.
@Table(name = "Items")
@Data
@Builder
public class Item {
@Id
@Column("item_id")
Long itemId;
@Column("title")
String title;
@Column("description")
String description;
@Column("start_time")
Date startTime;
@Column("end_time")
Date endTime;
@Transient
User user;
@Column("bid_user_ud")
Long bidUserId;
@Column("bid_amount")
Long bidAmount;
public Item() {
}
}
위 처럼 사용하면 reason: actual and formal argument lists differ in length 에러가 발생한다. @Builder를 사용했기 때문인데, builder는 암묵적으로 @AllArgsConstructor를 사용하는데 빈 생성자를 작성했기 때문이다.
이를 해결하기 위해서 빈 생성자 뿐만 아니라, 모든 멤버를 포함하는 생성자를 같이 명시해 주어야 한다.
생성자 없이 Builder를 사용하는 방법이 있음.
@JsonDeserialize를 이용해 Deserialize 하는데 어떤 builder를 쓸지 명시해주고 @JsonProperty("필드명")으로 필드명을 명시해주거나 @JsonPOJOBuilder(withPrefix = "")으로 빌더 자체를 생성해 주는 방법이 있음