@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”前缀。
我有以下 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”前缀。