【问题标题】:Jackson + FAIL_ON_MISSING_CREATOR_PROPERTIES + Lombok杰克逊 + FAIL_ON_MISSING_CREATOR_PROPERTIES + 龙目岛
【发布时间】:2018-12-14 03:46:33
【问题描述】:

我正在尝试在 objectMapper 上使用 Jackson 标志

objectMapper.enable(DeserializationFeature.FAIL_ON_MISSING_CREATOR_PROPERTIES);

如果没有在 json 中设置构造函数参数,这应该会导致对象反序列化失败。即,如果字段缺失而不是设置为 null。

但我注意到它只有在我要反序列化的对象具有这样的构造函数时才有效

public MyObject(@JsonProperty("id") UUID id, @JsonProperty("url") URL url) {
    this.id = id;
    this.url = url;
}

这有点问题,因为我希望使用 lombok 的 @AllArgsConstructor 来生成构造函数。但是,如果构造函数缺少 @JsonProperty(..),则 FAIL_ON_MISSING_CREATOR_PROPERTIES 检查不起作用。而是将参数作为 null 传入。

我在这里Can't make Jackson and Lombok work together 遇到了一些解决方案。但到目前为止,他们不为我工作。

有什么建议吗?

--- 更新---

我课上的注释是

@Data
@Builder
@ToString
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
@JsonInclude(JsonInclude.Include.NON_DEFAULT)
public class MyClass { ... }

【问题讨论】:

    标签: jackson deserialization lombok


    【解决方案1】:

    以下注释组合适用于 Lombok 1.18.0 和 Jackson 2.9(截至 2018 年 7 月的最新版本):

    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public static class Foo {
        private UUID id;
        private String url;
    }
    
    String json = "{\n" +
                  "  \"id\": \"32783be3-5355-41d2-807b-619e3481d220\",\n" +
                  "  \"url\": \"http://example.com\"\n" +
                  "}";
    
    ObjectMapper mapper = new ObjectMapper();
    Foo foo = mapper.readValue(json, Foo.class);
    

    【讨论】:

    • 我正在使用无参数构造函数。用课堂上的注释更新了我的答案。
    猜你喜欢
    • 2017-01-15
    • 1970-01-01
    • 1970-01-01
    • 2019-03-29
    • 1970-01-01
    • 1970-01-01
    • 2011-08-25
    • 2020-04-12
    • 1970-01-01
    相关资源
    最近更新 更多