java中的batchGetItem API出错

Man*_*amy 5 java amazon-web-services amazon-dynamodb

我查询的实体有一个HashKey&a RangeKey(数字).当我使用batchGetItem它时,我收到以下错误:

AWS错误代码:ValidationException,AWS错误消息:一个或多个参数值无效:位置和架构之间的属性类型不匹配

架构:

表:每日

哈希键:CustId(String)

范围键:日期(数量)

数据:

CustId:VisioNerdy

日期:1329071400000

码:

  List<Key> fkeys = new ArrayList<Key>(); //tableName="Daily", keys=["VisioNerdy"], ranges=[1329071400000]
    Map<String, KeysAndAttributes> requestItems = new HashMap<String, KeysAndAttributes>();
    for(int i = 0; i < keys.size(); i++)
    {
        String key = keys.get(i);
        if(ranges == null)
            fkeys.add(new Key().withHashKeyElement(new AttributeValue().withS(key)));
        else
            fkeys.add(new Key().withHashKeyElement(new AttributeValue().withS(key))
                    .withRangeKeyElement(new AttributeValue().withS(ranges.get(i).toString())));
    }
    requestItems.put(tableName, new KeysAndAttributes().withKeys(fkeys));
    BatchGetItemRequest batchGetItemRequest = new BatchGetItemRequest().withRequestItems(requestItems);
    BatchGetItemResult result = client.batchGetItem(batchGetItemRequest);
Run Code Online (Sandbox Code Playgroud)

有线索吗?

Ste*_*pel 8

您已将哈希和范围类型主键的range属性定义为Number类型,但是通过withS()类型String为您的请求准备其属性值:

fkeys.add(new Key().withHashKeyElement(new AttributeValue().withS(key))
        .withRangeKeyElement(new AttributeValue().withS(ranges.get(i).toString())));
Run Code Online (Sandbox Code Playgroud)

with(String s)更改为withN(String s)可以相应地解决您的问题(令人困惑的是两个方法都需要String类型的参数):

fkeys.add(new Key().withHashKeyElement(new AttributeValue().withS(key))
        .withRangeKeyElement(new AttributeValue().withN(ranges.get(i).toString())));
Run Code Online (Sandbox Code Playgroud)

不可否认,基于String参数的DynamoDB数据类型提交的隐式弱类型不能完全简化开发;)