与杰克逊JsonProperty的龙目岛建设者模式

时间:2018-08-01 11:01:48

标签: java jackson pojo lombok jackson-databind

我已经使用带有构建器模式的lombok构造了一个Java对象。但是,当尝试使用Jackson来反序列化Java对象时,出现以下异常。对于具有@JsonProperty批注的字段,会发生这种情况。

  

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

    }
}

请帮助我解决这个问题。

谢谢。

3 个答案:

答案 0 :(得分:4)

您会收到此错误,因为杰克逊不知道如何将user_name映射到您的任何UserBuilder字段。

您也需要在@JsonProperty("user_name")的{​​{1}}字段上输入userName,像这样:

UserBuilder

答案 1 :(得分:3)

从 Lombok v1.18.16 开始,您应该可以使用 @Jacksonized 注释。

@Data
@Jacksonized
@Builder
public class Pojo {

    @JsonProperty("package")
    String pkg;
}

答案 2 :(得分:2)

您的映射器需要一种创建User类的方法。

您可以使用构造函数:

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

  private int userId;
}

...或根据Tomasz Linkowski的答案将其指向构建器