我正在尝试使用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®ion=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
。这不会返回属性FirstName
和Age
,它们也是该项的一部分。如果我将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());
,您就会得到完整的响应。