DynamoDB Mapper Save方法无法向users表写入数据问题排查
DynamoDB Mapper Save无报错但扫描不到记录的排查问题
问题现象
使用DynamoDB Mapper对users表执行Save操作,代码无报错无异常,但执行扫描命令后看不到写入的记录。仅包含哈希键的UserTest类执行Save操作时,数据能成功写入表中。
相关代码与结果
写入代码片段
try{ User user = new User(); /* 为user对象填充测试数据*/ static AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build(); static DynamoDBMapper dynamoDB = new DynamoDBMapper(client, new DynamoDBMapperConfig(DynamoDBMapperConfig.SaveBehavior.CLOBBER)); dynamoDB.save(user); }catch(Exception e){ }
User类定义
@DynamoDBTable(tableName = "users") public class User { private String id; private String user_id; private String email; private String name; private String mobile_no; private Integer createdDate; private Integer modifiedDate; @DynamoDBHashKey(attributeName = "id") public String getId(){ return id; } public void setId(String id) { this.id = id; } @DynamoDBAttribute(attributeName = "user_id") public String getUser_id() { return user_id; } public void setUser_id_ref(String user_id) { this.user_id = user_id; } @DynamoDBAttribute(attributeName = "email") public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } @DynamoDBAttribute(attributeName = "name") public String getName() { return name; } public void setName(String name) { this.name = name; } @DynamoDBAttribute(attributeName = "mobile_no") public String getMobile_no() { return mobile_no; } public void setMobile_no(String mobile_no) { this.mobile_no = mobile_no; } @DynamoDBAttribute(attributeName = "created_date") public Integer getCreatedDate() { return createdDate; } public void setCreatedDate(Integer createdDate) { this.createdDate = createdDate; } @DynamoDBAttribute(attributeName = "modified_date") public Integer getModifiedDate() { return modifiedDate; } public void setModifiedDate(Integer modifiedDate) { this.modifiedDate = modifiedDate; } }
扫描命令及结果
aws dynamodb scan --table-name users
扫描结果:
{ "Items": [], "Count": 0, "ScannedCount": 0, "ConsumedCapacity": null }
表结构描述
aws dynamodb describe-table --table-name users
结果:
{ "Table": { "AttributeDefinitions": [ { "AttributeName": "id", "AttributeType": "S" } ], "TableName": "users", "KeySchema": [ { "AttributeName": "id", "KeyType": "HASH" } ], "TableStatus": "ACTIVE", "CreationDateTime": "2022-09-29T19:33:02.692000+05:30", "ProvisionedThroughput": { "LastDecreaseDateTime": "2022-09-29T19:45:29.763000+05:30", "NumberOfDecreasesToday": 0, "ReadCapacityUnits": 1, "WriteCapacityUnits": 1 } } }
成功写入的测试代码
UserTest类定义
package com.moneyview.model.dynamo; import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBHashKey; import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBTable; @DynamoDBTable(tableName = "users") public class UserTest { private String id; @DynamoDBHashKey(attributeName = "id") public String getId(){ return id; } public void setId(String id) { this.id = id; } }
测试写入代码
public void testinsertItem(){ try{ UserTest test = new UserTest(); test.setId("8a8180967e8b5112017e8b99268702df"); dynamoDB.save(test); }catch (Exception e){ System.out.println("Something went wrong while inserting the records to DynamoDb"); } }
扫描结果
{ "Items": [ { "id": { "S": "8a8180967e8b5112017e8b99268702df" } } ], "Count": 1, "ScannedCount": 1, "ConsumedCapacity": null }
排查方向与解决方案
修复Setter方法名,符合JavaBean规范
User类中user_id属性的setter方法名错误:getter为getUser_id(),对应的setter应该是setUser_id(String user_id),但当前是setUser_id_ref(String user_id)。DynamoDB Mapper依赖JavaBean规范识别属性,方法名不匹配会导致序列化失败,或者无法正确赋值属性,进而影响写入。修改该setter方法名即可。添加异常日志输出
原代码的catch块为空,无法得知Save过程中是否发生异常。建议在catch块中打印异常栈信息,比如:catch(Exception e){ e.printStackTrace(); }这样能快速捕获并定位写入过程中的错误。
验证哈希键赋值
确保填充User对象时,id属性(哈希键)被正确赋值。DynamoDB写入必须指定哈希键,若id为null,Save操作会失败,但空catch块会掩盖这个错误。
内容的提问来源于stack exchange,提问作者Murali Krishnamraju
相关产品推荐
相关产品推荐

