UpdateItemEnhancedRequest的ignoreNulls对嵌套DynamoDbBean不生效
问题:DynamoDB嵌套Bean更新时忽略空值失效
我有一个包含嵌套DynamoDbBean的实体类结构:
@DynamoDbBean public class OuterBean { private String Id; private InnerBean innerBean; public OuterBean() { } @DynamoDbPartitionKey @DynamoDbAttribute(value = "Id") public String getId() { return Id; } public void setId(String Id) { this.Id = Id; } @DynamoDbIgnoreNulls @DynamoDbAttribute(value = "innerBean") public InnerBean getInnerBean() { return innerBean; } public void setInnerBean(@Nullable InnerBean innerBean) { this.innerBean = innerBean; } } @DynamoDbBean public class InnerBean { private Integer field1; private Integer field2; public Integer getField1() { return field1; } public void setField1(Integer field1) { this.field1 = field1; } public Integer getField2() { return field2; } public void setField2(Integer field2) { this.field2 = field2; } }
我希望仅更新记录中InnerBean的field1属性,不修改OuterBean的其他属性,也不改动InnerBean的field2。但使用UpdateItemEnhancedRequest尝试时无法达到预期:
DynamoDbEnhancedClient client = DynamoDbEnhancedClient.builder() .dynamoDbClient( DynamoDbClient.builder() .region(Region.of("us-east-1")) .credentialsProvider(ProfileCredentialsProvider.create()) .build()) .build(); DynamoDbTable<OuterBean> table = client.table(caseTableName, TableSchema.fromBean(OuterBean.class)); OuterBean outerBean = new OuterBean(); outerBean.setId("1"); InnerBean innerBean = new InnerBean(); innerBean.setField1(1); // 注意这里field2为null outerBean.setInnerBean(innerBean); table.updateItem( UpdateItemEnhancedRequest .builder(OuterBean.class) .item(outerBean) .ignoreNulls(true) .build() );
尽管已经添加了@DynamoDbIgnoreNulls注解,并且在更新请求中设置了ignoreNulls(true),数据库里的field2还是被设置成了null,而不是被忽略。请问如何让嵌套Bean的空值在更新时被忽略?
解决方案
问题核心是**@DynamoDbIgnoreNulls只作用于当前Bean的直接属性,不会递归应用到嵌套的子Bean**。父Bean的注解只会判断整个子Bean是否为null,不会处理子Bean内部的空属性,需要在子Bean层面单独配置忽略规则。
方法1:给InnerBean类添加@DynamoDbIgnoreNulls注解
直接在InnerBean类上添加注解,让整个子Bean的空值属性都被忽略:
@DynamoDbBean @DynamoDbIgnoreNulls // 添加该注解 public class InnerBean { private Integer field1; private Integer field2; // getter和setter保持不变 }
方法2:给InnerBean的单个属性添加@DynamoDbIgnoreNulls
如果只想忽略特定的空值属性(比如仅忽略field2),可以在对应属性的getter方法上单独标注:
@DynamoDbBean public class InnerBean { private Integer field1; private Integer field2; public Integer getField1() { return field1; } public void setField1(Integer field1) { this.field1 = field1; } @DynamoDbIgnoreNulls // 仅忽略field2的空值 public Integer getField2() { return field2; } public void setField2(Integer field2) { this.field2 = field2; } }
额外说明
ignoreNulls(true)参数和@DynamoDbIgnoreNulls注解是互补关系:前者是全局开关,后者可以针对单个属性或类做更细粒度的控制。- 更新嵌套Bean时,父Bean的
@DynamoDbIgnoreNulls只会判断子Bean对象本身是否为null,不会深入子Bean内部处理其空属性,必须在子Bean层面单独配置。
内容的提问来源于stack exchange,提问作者Justin
相关产品推荐
相关产品推荐

