龙目岛+杰克逊不变

Ran*_*ds7 16 java immutability jackson lombok spring-boot

将我的项目更新为Spring Boot 1.5.10后,Lombok停止了与Jackson的正常工作.我的意思是不可变的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...
}
Run Code Online (Sandbox Code Playgroud)

因此,在将Spring Boot更新到1.5.10之后,这段代码无效,我需要像这样配置lombok:

lombok.anyConstructor.addConstructorProperties = true
Run Code Online (Sandbox Code Playgroud)

有没有人知道用jackson + lombok创建这样的对象没有这个lombok修复的任何其他方法?我可以使用以下代码代替此修复程序:@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 {
    }
}
Run Code Online (Sandbox Code Playgroud)

但它没有合作@JsonProperty("other-field-1-name").Ofc,它可以通过简单的方式完成@JsonCreator,但也许有一些方法可以使用它与lombok使用一些构造函数/ jackson注释?

sim*_*mon 2

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