为何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对象,直接调用就会触发空指针。
解决方案
- 空值判断+本地默认值
先判断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; }
- 跳过状态码逻辑(如果非必要)
如果业务不需要依赖HTTP状态码做判断,可以直接去掉这部分逻辑。DynamoDB操作成功时不会抛出异常,只有参数错误、资源不存在等失败场景才会抛出对应的AWS服务异常,通过捕获异常即可处理错误情况。
内容的提问来源于stack exchange,提问作者ClassHacker
相关产品推荐
相关产品推荐

