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

为何table.deleteItem(primaryKey)在DynamoDBLocal与真实DynamoDB表现不同?

DynamoDB Local删除操作时getSdkHttpMetadata()空指针异常问题

我的代码在真实DynamoDB服务中运行正常,但使用DynamoDB Local本地运行时触发空指针异常:

Cannot invoke "com.amazonaws.http.SdkHttpMetadata.getHttpStatusCode()" because the return value of "com.amazonaws.services.dynamodbv2.model.DeleteItemResult.getSdkHttpMetadata()" is null.

原代码:

DeleteItemOutcome outcome = table.deleteItem(primaryKey); 
int status = outcome.getDeleteItemResult().getSdkHttpMetadata().getHttpStatusCode();

尝试过带ReturnValue.ALL_OLD的DeleteItemSpec,依然报错:

DeleteItemSpec deleteItemSpec = new DeleteItemSpec()
            .withPrimaryKey("id", id)
            .withReturnValues(ReturnValue.ALL_OLD);
DeleteItemOutcome outcome = table.deleteItem(deleteItemSpec);
int status = outcome.getDeleteItemResult().getSdkHttpMetadata().getHttpStatusCode();

问题原因

DynamoDB Local作为本地模拟服务,和线上真实DynamoDB的响应结构存在差异——它不会像线上服务那样填充完整的SdkHttpMetadata对象,直接调用就会触发空指针。

解决方案

  1. 空值判断+本地默认值
    先判断getSdkHttpMetadata()是否为null,再获取状态码。本地环境下,只要操作没抛出异常就默认是成功状态(对应200):
DeleteItemOutcome outcome = table.deleteItem(primaryKey);
DeleteItemResult result = outcome.getDeleteItemResult();
int status;
if (result.getSdkHttpMetadata() != null) {
    status = result.getSdkHttpMetadata().getHttpStatusCode();
} else {
    // 本地环境默认返回成功状态码
    status = 200;
}
  1. 跳过状态码逻辑(如果非必要)
    如果业务不需要依赖HTTP状态码做判断,可以直接去掉这部分逻辑。DynamoDB操作成功时不会抛出异常,只有参数错误、资源不存在等失败场景才会抛出对应的AWS服务异常,通过捕获异常即可处理错误情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 23:02:38