使用apachecamel从DynamoDB检索项目



我正在尝试使用apachecamel-aws2-DynamoDB组件来检索项目。在文档中,我们可以使用操作getItem来实现这一点。我写了一个这样的代码->

.post("dynamodb-get-item")
.route()
.process(new Processor(){
@Override
public void process(Exchange exchange) throws Exception {
Map<String, AttributeValue> key = new HashMap();
key.put("LastName", AttributeValue.builder().s("Smith").build());
exchange.getIn().setHeader(Ddb2Constants.KEY, key);
exchange.getIn().setHeader(Ddb2Constants.ATTRIBUTE_NAMES, key.keySet());
}        
})
.toD("aws2-ddb://user?accessKey=insert&secretKey=insert&region=us-east-1&operation=getItem")
.process(new Processor(){
@Override
public void process(Exchange exchange) throws Exception {
Map<String, AttributeValue> response =  (Map<String, AttributeValue>) exchange.getIn().getHeader(Ddb2Constants.ATTRIBUTES);
exchange.getIn().setBody(response);
}
})
.convertBodyTo(String.class)
.endRest();

DynamoDb表的名称为user,键为LastName。此代码执行成功并返回此响应{LastName=AttributeValue(S=Smith, SS=[], NS=[], BS=[], M={}, L=[])}。此响应仅具有属性LastName。这不会返回属性FirstNameAge,它们也是该项的一部分。如果我将aws-cli与此命令aws dynamodb get-item --table-name user --key '{"LastName": {"S": "Smith"}}'一起使用,我会得到正确的响应,如so->

{
"Item": {
"LastName": {
"S": "Smith"
}, 
"Age": {
"N": "22"
}, 
"FirstName": {
"S": "Will"
}
}
}

如何使用apachecamel-aws2-DynamoDb组件的getItem生产者操作来获得如上所述的完整响应?

您使用了头Ddb2Constants.ATTRIBUTE_NAMES,它会导致过滤响应属性。

来自AWS DynamoDB组件文档:

CamelAwsDdbAttributeNames-如果未指定属性名称,则将返回所有属性。

所以只需删除行exchange.getIn().setHeader(Ddb2Constants.ATTRIBUTE_NAMES, key.keySet());,您就会得到完整的响应。

最新更新