我使用带有构建器模式的lombok构建了一个Java对象。但是,当我尝试使用Jackson反序列化Java对象时,我得到以下异常。对于具有@JsonProperty
注释的字段会发生这种情况。
线程“main”中的异常com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException:无法识别的字段“user_name”(类User $ UserBuilder),未标记为可忽略(2个已知属性:“userName”,“userId”]) 在[来源:(字符串)“{”userId“:1,”user_name“:”username“}”; line:1,column:26](通过引用链: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 {
}
}
请帮我解决这个问题。
谢谢。
你得到这个错误,因为杰克逊不知道如何将user_name
映射到你的任何UserBuilder
字段。
你也需要在@JsonProperty("user_name")
的userName
场上使用UserBuilder
,就像那样:
@JsonPOJOBuilder(withPrefix = "")
public static class UserBuilder {
@JsonProperty("user_name")
@NonNull
private String userName;
}
您的映射器需要有一种创建User类的方法。
你可以使用构造函数:
@NoArgsConstructor
@AllArgsConstructor
@Getter
@ToString
@Builder
class User {
@JsonProperty("user_name")
@NonNull
private String userName;
private int userId;
}
......或者根据Tomasz Linkowski的回答将其指向建造者