【问题标题】:UnrecognizedPropertyException when using Jackson, @JsonIdentityInfo and @JsonDeserialize with a lombok Builder将 Jackson、@JsonIdentityInfo 和 @JsonDeserialize 与 lombok Builder 一起使用时出现 UnrecognizedPropertyException
【发布时间】:2018-12-10 15:49:18
【问题描述】:

我正在尝试序列化和反序列化一个非常大的对象图。为了减少生成的 JSON 的大小,我想我会使用 Jackson 的 @JsonIdentityInfo 注释,这似乎适用于这个特定的用例。

但是,当我添加它时,它会爆炸。难的。示例代码如下:

Main.class

@Data
@Builder
@JsonDeserialize(builder = Main.MainBuilder.class)
@JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class)
public class Main {

    private final String name;
    @Singular
    private final Map<String, Main> mains;

    public static void main(String[] args) throws IOException {
        var test = Main.builder()
                .name("Root")
                .main("One", Main.builder()
                        .name("One")
                        .build())
                .main("Two", Main.builder()
                        .name("Two")
                        .build())
                .main("Three", Main.builder()
                        .name("Three")
                        .build())
                .build();

        var om = new ObjectMapper();
        var result = om.writeValueAsString(test);
        System.out.println(result);
        var back = om.readValue(result, Main.class);
    }

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

build.gradle

plugins {
    id 'java'
    id 'application'
}

repositories {
    jcenter()
    mavenCentral()
}

sourceCompatibility = 11
targetCompatibility = 11

mainClassName = 'dk.acto.Main'


dependencies {
    compileOnly 'org.projectlombok:lombok:1.18.0'
    implementation 'com.fasterxml.jackson.core:jackson-databind:2.9.7'
    annotationProcessor "org.projectlombok:lombok:1.18.0"
}

如果您注释掉 @JsonIdentityInfo 注释,代码将按预期工作,我真的不明白为什么。非常感谢任何帮助。

【问题讨论】:

    标签: java lombok jackson2


    【解决方案1】:

    它在反序列化@JsonIdentityInfo 添加的@id 字段时失败。您需要处理@id 字段。

    @JsonIgnoreProperties 添加到您的构建器将阻止它失败。

    @JsonPOJOBuilder(withPrefix = "")
    @JsonIgnoreProperties(ignoreUnknown=true)
    public static class MainBuilder {
    }
    

    就像将@id 添加到您的构建器一样

    @JsonPOJOBuilder(withPrefix = "")
    public static class MainBuilder {
        private int id;
        @JsonProperty(value="@id")
        public MainBuilder id() {
            this.id = id;
            return this;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-01
      • 2018-10-25
      • 1970-01-01
      相关资源
      最近更新 更多