龙目岛构建器模式与杰克逊JsonProperty

2022-09-02 20:32:32

我已经使用龙目岛和构建器模式构建了一个Java对象。但是,在尝试使用 Jackson 反序列化 Java 对象时,我遇到了以下异常。对于具有批注的字段,会发生这种情况。@JsonProperty

线程“main” com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException 中的异常:无法识别的字段“user_name”(类 User$UserBuilder),未标记为可忽略(2 个已知属性:“userName”,“userId”])
位于 [Source: (String)“{”userId“:1,”user_name“:”username“}”; 行: 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 {

    }
}

请帮助我解决这个问题。

谢谢。


答案 1

您收到此错误是因为 Jackson 不知道如何映射到您的任何字段。user_nameUserBuilder

你也需要在场上,像这样:@JsonProperty("user_name")userNameUserBuilder

@JsonPOJOBuilder(withPrefix = "")
public static class UserBuilder {

    @JsonProperty("user_name")
    @NonNull
    private String userName;
}

答案 2

您的映射器需要具有创建 User 类的方法。

您可以使用构造函数:

@NoArgsConstructor
@AllArgsConstructor
@Getter
@ToString
@Builder
class User {
  @JsonProperty("user_name")
  @NonNull
  private String userName;

  private int userId;
}

...或者根据Tomasz Linkowski的答案将其指向建筑商


推荐