Как сохранить картув DynamoDB? - PullRequest
0 голосов
/ 23 сентября 2019

Я пытаюсь добавить атрибут Map<String, LocalDateTime> в уже существующий DAO.Кажется, что AWS SDK не знает, как преобразовать это, так как я получаю эту ошибку:

.DynamoDBMappingException: not supported; requires @DynamoDBTyped or @DynamoDBTypeConverted

Я написал DynamoDBTypeConverter, чтобы попытаться решить эту проблему, но он не отображаетсяданные в правильном формате:

 public static class StringLocalDateTimeMapConverter
        implements DynamoDBTypeConverter<String, Map<String, LocalDateTime>> {
    @Override
    public String convert(Map<String, LocalDateTime> map) {
        try {
            if (map != null) {
                ObjectMapper mapper = new ObjectMapper();
                return mapper.writeValueAsString(map);
            } else {
                throw new Exception("map is empty");
            }
        } catch (Exception e) {
            LOGGER.error(String.format("Error converting map to Dynamo String. Reason - {%s}",
                    e.getMessage()));
            return "";
        }
    }

    @Override
    public Map<String, LocalDateTime> unconvert(String string) {
        try {
            ObjectMapper mapper = new ObjectMapper();
            return mapper.readValue(string, Map.class);
        } catch (Exception e) {
            LOGGER.error(String.format("Error unconverting Dynamo String to map. Reason - {%s}",
                    e.getMessage()));
            return new HashMap<>();
        }
    }
}

Однако это выглядит не так, как хотелось бы - в DDB карта в итоге выглядела так:

{\"1234567890\":{\"year\":2019,\"month\":\"SEPTEMBER\",\"monthValue\":9,\"dayOfMonth\":20,\"hour\":15,\"minute\":13,\"second\":26,\"nano\":98000000,\"dayOfWeek\":\"FRIDAY\",\"dayOfYear\":263,\"chronology\":{\"calendarType\":\"iso8601\",\"id\":\"ISO\"}}}

Я не уверен, чтолучший способ смоделировать эти данные, чтобы DDB был доволен этим.Какие-либо предложения?

Ответы [ 2 ]

0 голосов
/ 24 сентября 2019

Кажется, это проблема с ObjectMapper, а не с DynamoDb или с вашим CustomMapper.

Я полагаю, что вы используете Джексона, предоставляемого библиотекой AWS, возможно, вам нужно добавить JavaTimeModule в ваш проект, а затем.

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(new JavaTimeModule());

И все отлично работает.

Это ссылка на библиотеку https://mvnrepository.com/artifact/com.fasterxml.jackson.datatype/jackson-datatype-jsr310


0 голосов
/ 23 сентября 2019

возможно проанализировать localDateTime в строку перед сохранением в DDB и обязательно проанализировать его обратно в LocalDateTime после чтения из DDB. Вы можете сохранить его в формате ISO

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...