#java #apache-camel #amazon-dynamodb
#java #apache-camel #amazon-dynamodb
Вопрос:
Ситуация
Я пытаюсь записать в DynamoDB, используя компонент Apache Camel aws2-ddb. Мой маршрут считывает данные из реляционной базы данных с использованием JPA, выполняет преобразование в целевой класс и помещает этот класс в таблицу DynamoDB.
Целевой класс выглядит следующим образом (на самом деле, конечно, сложнее)
@DynamoDBTable(tableName = "MyDataTable")
public class MyData {
private String key;
private String foo;
private List<String> bar;
@DynamoDBHashKey(attributeName = "key")
public String getKey() { return key; }
@DynamoDBAttribute(attributeName = "foo")
public String getFoo() { return foo; }
@DynamoDBAttribute(attributeName = "bar")
public List<String> getBar() { return bar; }
// ...
}
Используя только AWS SDK, я бы просто сделал что-то вроде этого:
DynamoDBMapper mapper = new DynamoDBMapper(client);
mapper.save(myDataItem);
Однако компонент aws2-ddb требует, чтобы элемент был Map<String, AttributeValue>
.
Вопрос
Как я могу преобразовать аннотированный класс в Map<String, AttributeValue>
? Похоже, это должно быть что-то очевидное, но я, похоже, ничего не могу найти в AWS SDK.
(В качестве обходного пути я мог бы реализовать приведенный выше DynamoDBMapper
код в пользовательском процессоре, но я бы предпочел использовать компонент.)
Ответ №1:
К сожалению, во время детализации библиотеки camel-aws-ddb я не нашел возможности использовать DynamoDBMapper. По сути, компоненты aws-dbb / aws2-dbb используют DdbProducer под капотом, который фактически является процессором, вызывающим ddbClient PutItem в вашем случае.
Возможные варианты:
- Написание собственного компонента с использованием DynamoDBMapper вместо чистого ddbClient.
- Пользовательский процессор, как вы упомянули выше, установив элемент в заголовке (или даже компонент, если вам не нужно иметь дело с самим сообщением).
- Просто используя текущий API, который позволяет использовать элементы типа List<Map<String, AttributeValue>> помещая их в заголовок сообщения в конце.