【问题标题】:Lombok builder pattern with jackson JsonProperty带有杰克逊 JsonProperty 的 Lombok 构建器模式
【发布时间】: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 {

    }
}

请帮我解决这个问题。

谢谢。

【问题讨论】:

    标签: java jackson pojo lombok jackson-databind


    【解决方案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;
        }
        

        【讨论】:

          猜你喜欢
          • 2017-05-03
          • 2013-06-15
          • 2015-09-17
          • 2011-06-26
          • 2017-02-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-01-26
          相关资源
          最近更新 更多