Java 使用Jackson与Lombok builder反序列化 问题
的Java 使用Jackson与Lombok builder反序列化 问题,java,json,jackson,lombok,Java,Json,Jackson,Lombok,的@builder注释为类创建了一个。为了支持json项的反序列化(使用),我添加了以下注释: @Builder @JsonDeserialize(builder=Item.ItemBuilder.class) @JsonPOJOBuilder(前缀为“”) 公共类项目{ @吸气剂 字符串分区值; } 这是基于@Jacksonized。在使用反序列化程序时,对于存储在中的json文件,其内容仅为:{“partitionvalue”:“test”},我的代码是: AmazonS3 s3Clien
@builder
注释为类创建了一个。为了支持json项的反序列化(使用),我添加了以下注释:
@Builder
@JsonDeserialize(builder=Item.ItemBuilder.class)
@JsonPOJOBuilder(前缀为“”)
公共类项目{
@吸气剂
字符串分区值;
}
这是基于@Jacksonized
。在使用反序列化程序时,对于存储在中的json文件,其内容仅为:{“partitionvalue”:“test”}
,我的代码是:
AmazonS3 s3Client=AmazonS3ClientBuilder.standard()
.withCredentials(新的默认AWSCredentialsProviderChain())
.withRegion(地区)
.build();
S3Object S3Object=s3Client.getObject(新的GetObjectRequest(bucket,key));
Item Item=objectMapper.readValue(s3Object.getObjectContent(),Item.class);
但是,在json文件上运行时,Jackson失败,并显示以下消息:
无法识别的字段“partitionvalue”(class com.example.Test$TestBuilder),
未标记为可忽略(0个已知属性:)
位于[来源:com.amazonaws.services.s3.model]。S3ObjectInputStream@2ca47471;行:1,列:21](通过引用链:com.example.TestBuilder[“partitionvalue”])
额外细节
- 直接使用@
注释也不起作用,因为它是lombok实验性的,所以我使用了需要直接与builder一起使用的注释Jacksonized
- 通过在Lombok IntelliJ插件中使用“delombok”选项,我验证了Lombok将实现我对构建器类的期望:
公共类项目{
字符串分区值;
项(字符串分区值){
this.partitionvalue=partitionvalue;
}
公共静态ItemBuilder(){
返回新的ItemBuilder();
}
公共字符串getPartitionvalue(){
返回此.partitionvalue;
}
公共静态类ItemBuilder{
私有字符串partitionvalue;
ItemBuilder(){}
public Item.ItemBuilder分区值(字符串分区值){
this.partitionvalue=partitionvalue;
归还这个;
}
公共项目生成(){
返回新项目(partitionvalue);
}
公共字符串toString(){
返回“Item.ItemBuilder(partitionvalue=“+this.partitionvalue+””);
}
}
}
- 没有
注释(以及添加@Builder
+@noargsconstuctor
+@allargsconstuctor
)它工作正常,因此问题不在于S3存储桶中的文件或其解析方式@Setter
- 使用lombok-1.18.16(和.18)和
@Jacksonized
注释对我来说很有用。如果没有注释,我会得到与您相同的错误
@Builder
@Jacksonized
public class JsonizerItem {
@Getter private String partitionvalue;
}
@JsonPOJOBuilder
必须放在生成器类上,而不是类本身。如果没有@Jacksonized
,则必须按如下方式自定义生成的生成器类:
@Builder
@JsonDeserialize(builder = Item.ItemBuilder.class)
public class Item {
@Getter
String partitionvalue;
@JsonPOJOBuilder(withPrefix="")
public static class ItemBuilder {}
}
顺便说一句,我使用的是Jackson版本2.6,Lombok版本1.8,JavaSDK8。谢谢你的回答!然而,我选择@Jan Rieke answer作为接受答案,因为它提供了直接使用jacksonized内部注释不起作用的原因。
@Builder
@JsonDeserialize(builder = Item.ItemBuilder.class)
public class Item {
@Getter
String partitionvalue;
@JsonPOJOBuilder(withPrefix="")
public static class ItemBuilder {}
}