Я пытаюсь сохранить экземпляр класса ниже в Dynamdb, но получаю
DynamoDBMappingException: not supported; requires @DynamoDBTyped or @DynamoDBTypeConverted исключение.
@DynamoDBTable(tableName = "FulfillmentOrders")
public class FulfillmentOrder {
@DynamoDBHashKey
private String orderId;
@DynamoDBAttribute
@DynamoDBTyped(value = DynamoDBMapperFieldModel.DynamoDBAttributeType.M)
private Map<String, Object> body;
.......
}
Он не работает во время преобразования карты, похоже, проблема в универсальном типе объекта.
может кто-нибудь помочь, в чем проблема, или, может быть, SDK не поддерживает такое преобразование?
Спасибо!





DynamoDB не знает, как конвертировать object в Map<,>, вам придется создать специальный конвертер типов. как только вы это сделаете, вы можете аннотировать свойство с помощью @DynamoDBTypeConverted(converter = xxx):
В вашем примере:
@DynamoDBTable(tableName = "FulfillmentOrders")
public class FulfillmentOrder {
@DynamoDBHashKey
private String orderId;
@DynamoDBAttribute
@DynamoDBTypeConverted(converter = BodyTypeConverter.class)
private Map<String, Object> body;
}
static public class BodyTypeConverter implements DynamoDBTypeConverter<String, Map<String, Object>> {
@Override
public String convert(Map<String, Object> object) {
DimensionType itemDimensions = (Map<String, Object>) object;
// Convert the object to a DynamoDB json string
String json = "wibble";
return json;
}
@Override
public DimensionType unconvert(String s) {
Map<String, Object> item = new Map<String, Object>();
// Convert s to a Map<String, Object> here.
return item;
}
}
Более подробную информацию можно найти здесь
String - это лишь один из многих типов, которые поддерживает DynamoDB, если вы сопоставляете его с поддерживаемым типом, все будет в порядке (вот список поддерживаемых типов docs.aws.amazon.com/amazondynamodb/latest/developerguide/…)
В случае, если атрибут body будет иметь тип String, это решение работает нормально. Но если типом является карта (документ), преобразование не удается. Кажется, что если я хочу иметь тип документа, мне нужно зеркальное отображение POJO, Map <String, Object> не будет работать в этом случае.
Это потому, что он не знает, как сопоставить Object с типом DynamoDB. Таким образом, вы должны рассказать ему, как сопоставить ваш Object.
Да в том-то и дело. Значения карты могут иметь любой поддерживаемый DynamoDB тип. У вас есть пример для этого случая? Спасибо, Кевин!
У меня есть только примеры на C#, но они работают одинаково. Все, что вам нужно сделать, это преобразовать ваш Object на вашей карте во что-то, с чем может справиться DynamoDB.
Спасибо за ответ, Кевин! Итак, из вашего ответа это означает, что атрибут body в DynamoDb должен иметь тип String, а не Map, верно? В моем случае это тип карты.