首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Jackson与Lombok builder进行反序列化

使用Jackson与Lombok builder进行反序列化
EN

Stack Overflow用户
提问于 2021-02-27 14:22:36
回答 2查看 12.9K关注 0票数 9

问题

隆布克@builder注释为类创建了一个建筑商级。为了支持json项的反序列化(使用杰克逊的ObjectMapper),我添加了以下注释:

代码语言:javascript
运行
复制
@Builder
@JsonDeserialize(builder = Item.ItemBuilder.class)
@JsonPOJOBuilder(withPrefix="")
public class Item {
    @Getter
    String partitionvalue;
}

这是基于@Jacksonized 文档的。在使用反序列化器时,在存储在AWS S3桶中的json文件上,其内容是:{"partitionvalue": "test"},我的代码是:

代码语言:javascript
运行
复制
AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
            .withCredentials(new DefaultAWSCredentialsProviderChain())
            .withRegion(region)
            .build();
S3Object s3Object = s3Client.getObject(new GetObjectRequest(bucket, key));
Item item = objectMapper.readValue(s3Object.getObjectContent(), Item.class);

但是,当在json文件上运行杰克逊失败的消息时:

代码语言:javascript
运行
复制
Unrecognized field "partitionvalue" (class com.example.Test$TestBuilder),
 not marked as ignorable (0 known properties: ])
 at [Source: com.amazonaws.services.s3.model.S3ObjectInputStream@2ca47471; line: 1, column: 21] (through reference chain: com.example.TestBuilder["partitionvalue"])

额外细节

  • 直接使用@Jacksonized注释也不起作用,而且由于它是lombok实验的,所以我使用了我需要直接与构建器一起使用的注释。
  • 通过在Lombok IntelliJ插件中使用"delombok“选项,我验证了Lombok将执行我对构建器类的期望:
代码语言:javascript
运行
复制
public class Item {
    String partitionvalue;
    Item(String partitionvalue) {
        this.partitionvalue = partitionvalue;
    }
    public static ItemBuilder builder() {
        return new ItemBuilder();
    }
    public String getPartitionvalue() {
        return this.partitionvalue;
    }
    public static class ItemBuilder {
        private String partitionvalue;
        ItemBuilder() { }
        public Item.ItemBuilder partitionvalue(String partitionvalue) {
            this.partitionvalue = partitionvalue;
            return this;
        }
        public Item build() {
            return new Item(partitionvalue);
        }
        public String toString() {
            return "Item.ItemBuilder(partitionvalue=" + this.partitionvalue + ")";
        }
    }
}
  • 如果没有@Builder注释(并且添加了@NoArgsConstructor + @AllArgsConstructor + @Setter),它就工作得很好,所以问题不是来自S3桶的文件,也不是解析它的方式。
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-02-27 20:14:10

@JsonPOJOBuilder必须放在构建器类上,而不是类本身上。如果没有@Jacksonized,您必须按以下方式自定义生成的构建器类:

代码语言:javascript
运行
复制
@Builder
@JsonDeserialize(builder = Item.ItemBuilder.class)
public class Item {
    @Getter
    String partitionvalue;

    @JsonPOJOBuilder(withPrefix="")
    public static class ItemBuilder {}
}
票数 8
EN

Stack Overflow用户

发布于 2021-02-27 15:05:14

使用lombok-1.18.16 (和.18)与@Jacksonized注释一起工作。如果没有该注释,我将得到与您相同的错误。

代码语言:javascript
运行
复制
@Builder
@Jacksonized
public class JsonizerItem {

    @Getter private String partitionvalue;

}
代码语言:javascript
运行
复制
@Test
void test() throws JsonProcessingException {
    JsonizerItem item = new ObjectMapper().readValue("{ \"partitionvalue\" : \"test\"}", JsonizerItem.class);
    assertEquals("test", item.getPartitionvalue());
}
票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66399749

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档