龙目岛+杰克逊不变

时间:2018-02-06 13:59:29

标签: java spring-boot jackson immutability lombok

将我的项目更新为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:

lombok.anyConstructor.addConstructorProperties = true

有没有人知道使用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 {
    }
}

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

2 个答案:

答案 0 :(得分:1)

所以这不是完全相同的情况,但这适用于我的问题。我需要在构建器上使用@JsonDeserialize注释,将它放在构建器上明确解决问题(以样板代码为代价)。至少我不需要输出构建器的其余部分。

  
UIView

答案 1 :(得分:0)

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

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

在1.16.20中有很多努力专门解决JDK 9中的重大变化,这可能会导致JDK 8上的问题继续发展。

1.16.20 @Data object no longer constructable for jackson?<其他承认类似问题的人。