Запись элемента в DynamoDB с использованием Apache Camel с аннотациями Java для DynamoDB

#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>> помещая их в заголовок сообщения в конце.