You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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
}

排查方向与解决方案

  1. 修复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方法名即可。

  2. 添加异常日志输出
    原代码的catch块为空,无法得知Save过程中是否发生异常。建议在catch块中打印异常栈信息,比如:

    catch(Exception e){
        e.printStackTrace();
    }
    

    这样能快速捕获并定位写入过程中的错误。

  3. 验证哈希键赋值
    确保填充User对象时,id属性(哈希键)被正确赋值。DynamoDB写入必须指定哈希键,若id为null,Save操作会失败,但空catch块会掩盖这个错误。

内容的提问来源于stack exchange,提问作者Murali Krishnamraju

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 01:10:33