Spring Boot集成DynamoDB存数据报错:无法操作不存在的表
排查Spring Boot + 本地DynamoDB表不存在的问题
这个ResourceNotFoundException报错非常明确——你要操作的表在本地DynamoDB实例里压根没创建出来。结合你的配置和操作流程,我给你梳理几个靠谱的排查方向和解决办法:
1. 先确认本地DynamoDB里真的有目标表
本地DynamoDB不会自动根据实体类生成表,哪怕你写了@DynamoDBTable注解也不行。你可以用两种方式验证:
- AWS CLI命令检查:打开终端执行以下命令,看看输出的表列表里有没有你要操作的表(比如
Person,取决于你实体类上@DynamoDBTable指定的表名):aws dynamodb list-tables --endpoint-url http://localhost:8001 - 本地控制台查看:访问
http://localhost:8001/shell/,在弹出的JavaScript控制台里输入dynamodb.listTables({})并执行,就能看到当前所有存在的表。
2. 确保表创建逻辑正确执行
如果是靠代码创建表,一定要确认这段代码真的跑起来了。比如你可以在Spring Boot启动类里加个初始化逻辑:
@Autowired private AmazonDynamoDB amazonDynamoDB; @PostConstruct public void initDynamoDBTables() { // 根据实体类生成建表请求 CreateTableRequest tableRequest = DynamoDBMapper.generateCreateTableRequest(Person.class); // 本地测试读写容量设为1足够 tableRequest.setProvisionedThroughput(new ProvisionedThroughput(1L, 1L)); try { amazonDynamoDB.createTable(tableRequest); // 等待表创建完成(本地DynamoDB创建很快,但保险起见加个等待) amazonDynamoDB.waitForTableExists(tableRequest.getTableName()); } catch (ResourceInUseException e) { // 表已经存在就忽略这个异常 System.out.println("Table already exists: " + tableRequest.getTableName()); } }
⚠️ 注意:你的Person实体类必须正确配置DynamoDB注解,比如@DynamoDBTable(tableName = "Person"),主键字段要加@DynamoDBHashKey,普通字段加@DynamoDBAttribute,否则generateCreateTableRequest会生成无效请求。
3. 检查DynamoDB客户端配置是否匹配本地实例
你的amazonDynamoDBConfig()配置里,这几个参数一定要核对:
awsDynamoDBEndPoint必须是http://localhost:8001,和你启动本地DynamoDB的端口完全一致;awsRegion可以随便填(比如us-east-1),本地DynamoDB不校验Region,但不能留空;awsAccessKey和awsSecretKey本地测试可以随便填(比如test/test),但必须配置——如果留空,客户端会尝试读取环境变量或默认配置,可能不小心连接到线上DynamoDB而非本地实例!
4. 关于-sharedDb参数的小细节
你启动命令里加了-sharedDb,这个参数会让所有连接到本地实例的应用共享同一个数据库文件(默认是./shared-local-instance.db)。如果之前你用不同配置创建过表、或者手动删除过表,就可能出现找不到表的情况。你可以试试删除这个db文件,重启本地DynamoDB后重新创建表。
快速验证技巧
如果你想快速定位问题,可以先手动用CLI创建表,再调用mapper.save()试试:
aws dynamodb create-table --table-name Person --attribute-definitions AttributeName=id,AttributeType=S --key-schema AttributeName=id,KeyType=HASH --provisioned-throughput ReadCapacityUnits=1,WriteCapacityUnits=1 --endpoint-url http://localhost:8001
如果手动创建后能正常保存数据,那问题肯定出在你的代码建表逻辑上,而非客户端配置。
内容的提问来源于stack exchange,提问作者Amit S H
相关产品推荐
相关产品推荐

