DynamoDBMapper:如何获取保存的项目?

DynamoDBMapper: How to get saved item?

对于一个简单的 Java REST-API 我创建了一个保存函数来将我的模型保存到 DynamoDB table。

模型使用自动生成的范围键,您可以在此处看到:

@DynamoDBTable(tableName = "Events")
public class EventModel {
    private int country;
    private String id;
    // ...

    @DynamoDBHashKey
    public int getCountry() {
        return country;
    }
    public void setCountry(int country) {
        this.country = country;
    }

    @DynamoDBRangeKey
    @DynamoDBAutoGeneratedKey
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }

    //...
}

不幸的是,DynamoDBMappers .save() method 没有 return 任何东西。我想 return 创建的项目在我的 201 HTTP 响应中设置正确的 location header。

public EventModel create(EventModel event) {
    mapper.save(event);
    return null;
}

我怎样才能做到这一点?有什么建议么?当然我可以在客户端生成 id 但我不想这样做,因为解决潜在的原子性问题需要在客户端和 server-side.

上添加额外的逻辑

我正在使用版本 1.11.86 中的 aws-java-sdk-dynamodb

没关系,我想出了办法。 .save() 方法更新对象的引用。调用 mapper.save(event); 后,id 属性 被填充并具有其值。

所以让它工作的方法就是:

public EventModel create(EventModel event) {
    mapper.save(event);
    return event;
}

就是这样!

在 put/update 之后,可以通过 dynamo db mapper 直接获取保存在 dynamodb 中的内容 如果您使用 DynamoDBConfig 保存为 CLOBBER 或 [=11=,m4xy@ 提到的方法会起作用].如果您使用的是 UPDATE_SKIP_NULL_ATTRIBUTES,此方法将不起作用。 如果您使用的是映射器,则必须再次专门调用 db 以获取现有值(如果有多个编写器,则可能已更新,您可能会得到意想不到的结果)。为确保读取符合您的预期,您可以为写入实现锁定,这样,如果给定线程获取了锁定,则其他线程无法为给定键写入。但是,这种方法的缺点是会减慢您的应用程序。 或者,您可以使用具有 api 的 dynamoDBClient 在写入后支持 return db 值。 https://sdk.amazonaws.com/java/api/2.0.0-preview-11/index.html?software/amazon/awssdk/services/dynamodb/DynamoDbClient.html