带有 jackson JsonProperty 的 Lombok 构建器模式
Lombok builder pattern with jackson JsonProperty
我使用带有构建器模式的 lombok 构建了一个 Java 对象。但是,在尝试使用 Jackson 反序列化 Java 对象时出现以下异常。对于具有 @JsonProperty
注释的字段,会发生这种情况。
Exception in thread "main" com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "user_name" (class User$UserBuilder), not marked as ignorable (2 known properties: "userName", "userId"])
at [Source: (String)"{"userId":1,"user_name":"username"}"; line: 1, column: 26] (through reference chain: User$UserBuilder["user_name"])
使用的代码:
public class TestJson {
public static void main(String args[]) throws Exception {
ObjectMapper objectMapper = new ObjectMapper();
User user = User.builder()
.userName("username")
.userId(1)
.build();
System.out.println(user);
String string = objectMapper.writeValueAsString(user);
System.out.println(string);
user = objectMapper.readValue(string, User.class);
System.out.println(user);
}
}
@JsonDeserialize(builder = User.UserBuilder.class)
@Getter
@ToString
@Builder(toBuilder = true)
class User {
@JsonProperty("user_name")
@NonNull
private String userName;
@JsonProperty
private int userId;
@JsonPOJOBuilder(withPrefix = "")
public static class UserBuilder {
}
}
请帮我解决这个问题。
谢谢。
您收到此错误是因为 Jackson 不知道如何将 user_name
映射到您的任何 UserBuilder
字段。
您也需要 UserBuilder
的 userName
字段上的 @JsonProperty("user_name")
,像这样:
@JsonPOJOBuilder(withPrefix = "")
public static class UserBuilder {
@JsonProperty("user_name")
@NonNull
private String userName;
}
您的映射器需要能够创建用户 class。
您可以使用构造函数:
@NoArgsConstructor
@AllArgsConstructor
@Getter
@ToString
@Builder
class User {
@JsonProperty("user_name")
@NonNull
private String userName;
private int userId;
}
... 或根据 Tomasz Linkowski 的回答将其指向构建器
从 Lombok v1.18.16 开始,您应该可以使用 @Jacksonized 注释。
@Data
@Jacksonized
@Builder
public class Pojo {
@JsonProperty("package")
String pkg;
}
尝试更新版本
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
<version>1.18.22</version>
</dependency>
我使用带有构建器模式的 lombok 构建了一个 Java 对象。但是,在尝试使用 Jackson 反序列化 Java 对象时出现以下异常。对于具有 @JsonProperty
注释的字段,会发生这种情况。
Exception in thread "main" com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "user_name" (class User$UserBuilder), not marked as ignorable (2 known properties: "userName", "userId"])
at [Source: (String)"{"userId":1,"user_name":"username"}"; line: 1, column: 26] (through reference chain: User$UserBuilder["user_name"])
使用的代码:
public class TestJson {
public static void main(String args[]) throws Exception {
ObjectMapper objectMapper = new ObjectMapper();
User user = User.builder()
.userName("username")
.userId(1)
.build();
System.out.println(user);
String string = objectMapper.writeValueAsString(user);
System.out.println(string);
user = objectMapper.readValue(string, User.class);
System.out.println(user);
}
}
@JsonDeserialize(builder = User.UserBuilder.class)
@Getter
@ToString
@Builder(toBuilder = true)
class User {
@JsonProperty("user_name")
@NonNull
private String userName;
@JsonProperty
private int userId;
@JsonPOJOBuilder(withPrefix = "")
public static class UserBuilder {
}
}
请帮我解决这个问题。
谢谢。
您收到此错误是因为 Jackson 不知道如何将 user_name
映射到您的任何 UserBuilder
字段。
您也需要 UserBuilder
的 userName
字段上的 @JsonProperty("user_name")
,像这样:
@JsonPOJOBuilder(withPrefix = "")
public static class UserBuilder {
@JsonProperty("user_name")
@NonNull
private String userName;
}
您的映射器需要能够创建用户 class。
您可以使用构造函数:
@NoArgsConstructor
@AllArgsConstructor
@Getter
@ToString
@Builder
class User {
@JsonProperty("user_name")
@NonNull
private String userName;
private int userId;
}
... 或根据 Tomasz Linkowski 的回答将其指向构建器
从 Lombok v1.18.16 开始,您应该可以使用 @Jacksonized 注释。
@Data
@Jacksonized
@Builder
public class Pojo {
@JsonProperty("package")
String pkg;
}
尝试更新版本
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
<version>1.18.22</version>
</dependency>