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”])
额外细节
  • 直接使用@
    Jacksonized
    注释也不起作用,因为它是lombok实验性的,所以我使用了需要直接与builder一起使用的注释

  • 通过在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
    +
    @Setter
    )它工作正常,因此问题不在于S3存储桶中的文件或其解析方式
    • 使用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 {}
      }