@JsonNaming 不适用于 lombok 构建器

@JsonNaming not working with lombok builder

我有以下 class


@JsonNaming(PropertyNamingStrategy.UpperCamelCaseStrategy.class)
public class Test {

    String tTObj;
    String value;

    public String gettTObj() {
        return tTObj;
    }

    public void settTObj(final String tTObj) {
        this.tTObj = tTObj;
    }

    public String getValue() {
        return value;
    }

    public void setValue(final String value) {
        this.value = value;
    }

    public static void main(final String[] args) throws IOException {
        final String json = "{\"TTObj\" : \"hi\", \"Value\": \"hello\"}";

        final ObjectMapper objectMapper = new ObjectMapper();

        final Test test = objectMapper.readValue(json, Test.class);

        System.out.println(test);
    }
}

以上一个工作正常并且能够反序列化。

但是如果我使用 lombok 构建器进行反序列化,它会失败。

下面是 class 用于反序列化的 lombok 构建器

@JsonDeserialize(builder = Test.Builder.class)
@Value
@Builder(setterPrefix = "with", builderClassName = "Builder", toBuilder = true)
@JsonNaming(PropertyNamingStrategy.UpperCamelCaseStrategy.class)
public class Test {

    String tTObj;
    String value;

    public static void main(final String[] args) throws IOException {
        final String json = "{\"TTObj\" : \"hi\", \"Value\": \"hello\"}";

        final ObjectMapper objectMapper = new ObjectMapper();

        final Test test = objectMapper.readValue(json, Test.class);

        System.out.println(test);
    }
}

遇到以下错误

Exception in thread "main" com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "TTObj" (class com.demo.Test$Builder), not marked as ignorable (2 known properties: "value", "ttobj"])
 at [Source: (String)"{"TTObj" : "hi", "Value": "hello"}"; line: 1, column: 13] (through reference chain: com.demo.Test$Builder["TTObj"])

如何使用带有 lombok 生成器的 @JsonNaming 反序列化"{"TTObj" : "hi", "Value": "hello"}"

class 上的 Jackson 注释也必须出现在构建器 class 上才能对反序列化产生影响。 Lombok 1.18.14 引入了自动将 @JsonNaming 复制到构建器 class。

但是,io.freefair.lombok Gradle 版本 5.1.0 中的插件默认使用 Lombok 版本 1.18.12。所以这是一个太旧的版本(龙目岛仅使用偶数作为 minor/patch 级别编号)。

您可以使用更新版本的 Gradle 插件,或 configure it manually to use a newer Lombok version 通过 build.gradle:

lombok {
    version = "1.18.20"
}

PS:对于 Lombok >= 1.18.14,您可以考虑使用 @Jacksonized 而不是手动配置构建器:

@Value
@Jacksonized
@Builder(builderClassName = "Builder", toBuilder = true)
@JsonNaming(PropertyNamingStrategy.UpperCamelCaseStrategy.class)
public class Test {
    ...
}

在这种情况下,您不需要 @JsonDeserialize 注释和“with”前缀。