bodyToMono ObejectMapper관련 오류

Gonee·2022년 12월 4일

삽질공간

목록 보기
2/6

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 = "")으로 빌더 자체를 생성해 주는 방법이 있음

참고
https://knunu.tistory.com/12

profile
서버 개발자

0개의 댓글