龙目岛 + 杰克逊不可变

将我的项目更新到Spring Boot 1.5.10后,龙目岛停止与杰克逊一起正常工作。我的意思是不可变的DTO创建,当我的对象中的字段名称与json请求中的字段不同时:

@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 {
    }
}

但它不适用于 .Ofc,它可以通过简单的来完成,但也许有一些方法可以使用一些构造函数/杰克逊注释将其与龙目岛一起使用?@JsonProperty("other-field-1-name")@JsonCreator


答案 1

所以这不是完全相同的情况,但这适用于我的问题。我需要在构建器上@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;
        }  
    }
}

答案 2

考虑到这个问题是在2017年1月之后提出的,我假设您可能已经升级了龙目岛版本以及Spring Boot。并且仍在使用 JDK 81.16.20

您可以更新您的Spring Boot版本,但可能希望将龙目岛版本保留为 。这将允许您通过构建器工作实现额外的自定义和反序列化。也就是说,只要你没有使用任何新的龙目岛注释。1.16.18

在 1.16.20 中,有大量工作专门用于解决 JDK 9 中的重大更改,这些更改可能会导致 JDK 8 上出现问题。

1.16.20 @Data对象不再可为杰克逊构建?< 认识到类似问题的其他个人。