DynamoDB执行put操作报错需@DynamoDBTyped或@DynamoDBTypeConverted,get/delete正常如何解决
问题排查步骤
- 检查实体类访问权限:你提供的Test1类为默认包访问权限,DynamoDBMapper序列化对象时无法正确识别非public类的属性映射规则,读操作仅需要反射给字段赋值因此不受影响,写操作触发序列化校验就会报错。
- 检查getter/setter冲突:你使用Groovy开发,Groovy默认会自动给类的私有字段生成public getter/setter,你同时手写了包访问权限的getter/setter,导致DynamoDBMapper扫描到重复的属性访问器,误判属性为不支持的未知类型。
- 检查注解作用位置:你将DynamoDB相关注解全部加在包访问权限的getter方法上,Mapper无法扫描到非public的getter方法,也就无法识别属性的映射规则。
解决方案
方案1:调整访问权限和getter/setter逻辑
将实体类改为public,要么删除手写的getter/setter直接用Groovy自动生成的,要么把手写的getter/setter改为public权限,参考代码如下:
@AllArgsConstructor @NoArgsConstructor @DynamoDBTable(tableName = "test1") public class Test1{ private String prime private String lastname @DynamoDBHashKey(attributeName = "prime") public String getPrime() { return prime } public void setPrime(String prime) { this.prime = prime } @DynamoDBAttribute(attributeName = "lastname") public String getLastname() { return lastname } public void setLastname(String lastname) { this.lastname = lastname } @Override public String toString() { return "Test1 [prime=" + prime + ", lastname=" + lastname +"]" } }
方案2:注解直接加在字段上
给类添加@DynamoDBDocument注解,直接将所有DynamoDB相关注解加在字段上,不需要单独配置getter方法,参考代码如下:
@AllArgsConstructor @NoArgsConstructor @DynamoDBTable(tableName = "test1") @DynamoDBDocument public class Test1{ @DynamoDBHashKey(attributeName = "prime") private String prime @DynamoDBAttribute(attributeName = "lastname") private String lastname @Override public String toString() { return "Test1 [prime=" + prime + ", lastname=" + lastname +"]" } }
方案3:显式指定字段类型
如果以上方案都不生效,可以在字段上添加@DynamoDBTyped注解显式声明DynamoDB属性类型,参考代码如下:
@DynamoDBHashKey(attributeName = "prime") @DynamoDBTyped(DynamoDBMapperFieldModel.DynamoDBAttributeType.S) private String prime @DynamoDBAttribute(attributeName = "lastname") @DynamoDBTyped(DynamoDBMapperFieldModel.DynamoDBAttributeType.S) private String lastname
内容的提问来源于stack exchange,提问作者sai chand
相关产品推荐
相关产品推荐

