带有杰克逊 JsonProperty 的 Lombok 构建器模式

Posted

技术标签:

【中文标题】带有杰克逊 JsonProperty 的 Lombok 构建器模式【英文标题】:Lombok builder pattern with jackson JsonProperty 【发布时间】:2019-01-08 22:16:12 【问题描述】:

我已经使用带有构建器模式的 lombok 构造了一个 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,列: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】:

尝试更新版本

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
        <version>1.18.22</version>
    </dependency>

【讨论】:

【参考方案2】:

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

@Data
@Jacksonized
@Builder
public class Pojo 

    @JsonProperty("package")
    String pkg;

【讨论】:

【参考方案3】:

您的映射器需要有一种创建用户类的方法。

你可以使用构造函数:

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

  private int userId;

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

【讨论】:

对我来说,最合适的格式是使用构建器模式。我不想使用构造函数。【参考方案4】:

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

UserBuilderuserName 字段上也需要@JsonProperty("user_name"),就像这样:

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

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

【讨论】:

以上是关于带有杰克逊 JsonProperty 的 Lombok 构建器模式的主要内容,如果未能解决你的问题,请参考以下文章

杰克逊将字符串转换为对象

使用杰克逊解析领域模型

我如何强迫杰克逊使用对象的定位器?

如何使用杰克逊映射器自动识别不同的类型

如何用杰克逊反序列化空字符串?

在 Spring Boot + Spring Data Rest 中反序列化时忽略带有 @JsonProperty 的字段