问题
隆布克的@builder
注释为类创建了一个建筑商级。为了支持json项的反序列化(使用杰克逊的ObjectMapper),我添加了以下注释:
@Builder
@JsonDeserialize(builder = Item.ItemBuilder.class)
@JsonPOJOBuilder(withPrefix="")
public class Item {
@Getter
String partitionvalue;
}
这是基于@Jacksonized
文档的。在使用反序列化器时,在存储在AWS S3桶中的json文件上,其内容是:{"partitionvalue": "test"}
,我的代码是:
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文件上运行杰克逊失败的消息时:
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实验的,所以我使用了我需要直接与构建器一起使用的注释。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桶的文件,也不是解析它的方式。发布于 2021-02-27 20:14:10
@JsonPOJOBuilder
必须放在构建器类上,而不是类本身上。如果没有@Jacksonized
,您必须按以下方式自定义生成的构建器类:
@Builder
@JsonDeserialize(builder = Item.ItemBuilder.class)
public class Item {
@Getter
String partitionvalue;
@JsonPOJOBuilder(withPrefix="")
public static class ItemBuilder {}
}
发布于 2021-02-27 15:05:14
使用lombok-1.18.16 (和.18)与@Jacksonized
注释一起工作。如果没有该注释,我将得到与您相同的错误。
@Builder
@Jacksonized
public class JsonizerItem {
@Getter private String partitionvalue;
}
@Test
void test() throws JsonProcessingException {
JsonizerItem item = new ObjectMapper().readValue("{ \"partitionvalue\" : \"test\"}", JsonizerItem.class);
assertEquals("test", item.getPartitionvalue());
}
https://stackoverflow.com/questions/66399749
复制相似问题