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

时间:2017-01-31 15:18:01

标签: java rest amazon-web-services amazon-dynamodb objectmapper

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

模型使用自动生成的范围键,如下所示:

@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没有返回任何内容。我想返回创建的项目,以便在我的201 HTTP响应中设置正确的location标题。

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

我该如何做到这一点?有什么建议?当然我可以在客户端生成id,但我不想这样做,因为解决潜在的原子性问题需要客户端和服务器端的额外逻辑。

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

2 个答案:

答案 0 :(得分:3)

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

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

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

就是这样!

答案 1 :(得分:0)

有直接方法通过dynamo db映射器获取放置/更新后保存在dynamodb中的内容,如果将DynamoDBConfig保存为CLOBBERUPDATE,则m4xy @提到的方法将可行。如果您使用的是UPDATE_SKIP_NULL_ATTRIBUTES,则此方法将无效。 如果使用的是mapper,则必须再次专门调用db以获取现有值(如果存在多个编写器,则可能已更新该值,并且可能会得到意外的结果)。为确保您期望读取,您可以实现写锁定,这样,如果给定线程获取了锁定,则其他线程都无法为给定密钥进行写操作。但是,这种方法的缺点是降低了您的应用程序的速度。 或者,您可以使用具有api的dynamoDBClient,以支持写入后返回的db值。 https://sdk.amazonaws.com/java/api/2.0.0-preview-11/index.html?software/amazon/awssdk/services/dynamodb/DynamoDbClient.html