source

롬복 + 잭슨 불변량

ittop 2023. 7. 21. 21:57
반응형

롬복 + 잭슨 불변량

제 프로젝트를 Spring Boot 1.5.10으로 업데이트한 후, Lombok은 Jackson과 제대로 작동하지 않게 되었습니다.내 말은 내 객체의 필드 이름이 json 요청의 필드와 다를 때 불변 DTO 생성을 의미합니다.

@Value
@Builder
public class MyImmutableDto implements Serializable {

    @JsonProperty("other-field-1-name")
    private final BigDecimal myField1;

    @JsonProperty("other-field-2-name")
    private final String myField2;

    and a lot of fields there...
}

그래서 Spring Boot를 1.5.10으로 업데이트한 후 이 코드가 작동하지 않으며, 롬복을 다음과 같이 구성해야 합니다.

lombok.anyConstructor.addConstructorProperties = true

이 롬복 수정 없이 잭슨 + 롬복으로 그런 개체를 만드는 다른 방법을 아는 사람이 있습니까?이 수정 대신 다음 코드를 사용할 수 있습니다.@JsonPOJOBuilder그리고.@JsonDeserialize(builder = MyDto.MyDtoBuilder.class):

@Value
@Builder
@JsonDeserialize(builder = MyDto.MyDtoBuilder.class)
public class MyDto implements Serializable {

    // @JsonProperty("other-field-1-name")    // not working
    private final BigDecimal myField1;

    private final String myField2;
    private final String myField3;
    and a lot of fields there...

    @JsonPOJOBuilder(withPrefix = "")
    public static final class MyDtoBuilder {
    }
}

하지만 그것은 작동하지 않습니다.@JsonProperty("other-field-1-name")물론, 그것은 간단한 방법으로 할 수 있습니다.@JsonCreator하지만 일부 생성자/스캐너 주석을 사용하여 롬복과 함께 사용할 수 있는 방법이 있을까요?

그래서 이것은 정확히 같은 경우는 아니지만, 이것은 제 문제에 효과가 있습니다.저는 빌더에 @JsonDeserialize 주석이 필요합니다. 빌더에 그것을 붙이면 문제가 명시적으로 해결됩니다(보일러 플레이트 코드 비용으로).적어도 나머지 건설업자들은 타이핑할 필요가 없습니다.

@Value
@Builder
@JsonDeserialize(builder = ProductPrice.ProductPriceBuilder.class)
public class ProductPrice {

    @JsonSerialize(using = MoneySerializer.class)
    @JsonDeserialize(using = MoneyDeserializer.class)
    Money price;

    Duration rentalLength;

    Period recurrence;

    @JsonPOJOBuilder(withPrefix = "")
    public static class ProductPriceBuilder{
        @JsonDeserialize(using = MoneyDeserializer.class)
        public ProductPrice.ProductPriceBuilder price(Money price) {
            this.price = price;
            return this;
        }  
    }
}

이 질문이 2017년 1월 이후에 제기된 것을 고려하면, 저는 당신이 롬복 버전을 업그레이드했을 수도 있다고 생각합니다.1.16.20스프링 부츠와 함께.그리고 여전히 JDK 8을 사용하고 있습니다.

Spring Boot 버전을 업데이트할 수 있지만 Lombok 버전을 다음 위치로 유지할 수 있습니다.1.16.18이를 통해 추가 사용자 정의 및 역직렬화를 빌드 작업을 통해 구현할 수 있습니다.즉, 새로운 롬복 주석을 사용하지 않는 한.

1.16.20에서는 특히 JDK 8에서 잠재적으로 문제를 일으킬 수 있는 JDK 9의 중단된 변경 사항을 해결하기 위한 상당한 노력이 있었습니다.

1.16.20 @ 잭슨을 위해 더 이상 데이터 객체를 구성할 수 없습니까?< 그 밖에 유사한 문제를 인식한 사람

언급URL : https://stackoverflow.com/questions/48644809/lombok-jackson-immutables

반응형