DynamoDBMapper for java.time.LocalDateTime

时间:2015-01-21 21:45:32

标签: java datetime amazon-dynamodb

我在我的java应用程序中使用java.time.LocalDateTime。我还尝试使用DynamoDBMapper并通过注释保存LocalDateTime变量。不幸的是我收到以下错误:

DynamoDBMappingException: Unsupported type: class java.time.LocalDateTime

有没有办法在不使用DynamoDBMarshalling的情况下进行此映射?

2 个答案:

答案 0 :(得分:14)

没有AWS DynamoDB Java SDK无法在不使用任何注释的情况下本地映射java.time.LocalDateTime。

要执行此映射,您必须使用AWS Java SDK 1.11.20版中引入的DynamoDBTypeConverted注释。从此版本开始,不推荐使用注释DynamoDBMarshalling

你可以这样做:

class MyClass {

    ...

    @DynamoDBTypeConverted( converter = LocalDateTimeConverter.class )
    public LocalDateTime getStartTime() {

        return startTime;
    }

    ...

    static public class LocalDateTimeConverter implements DynamoDBTypeConverter<String, LocalDateTime> {

        @Override
        public String convert( final LocalDateTime time ) {

            return time.toString();
        }

        @Override
        public LocalDateTime unconvert( final String stringValue ) {

            return LocalDateTime.parse(stringValue);
        }
    }
}

使用此代码,存储的日期将以ISO-8601格式保存为字符串,如:2016-10-20T16:26:47.299

答案 1 :(得分:2)

尽管我说过,但我发现使用DynamoDBMarshalling编组来回字符串很简单。这是我的代码段和AWS reference

class MyClass {

    ...

    @DynamoDBMarshalling(marshallerClass = LocalDateTimeConverter.class)
    public LocalDateTime getStartTime() {
        return startTime;
    }

    ...
    static public class LocalDateTimeConverter implements DynamoDBMarshaller<LocalDateTime> {

        @Override
        public String marshall(LocalDateTime time) {
            return time.toString();
        }

        @Override
        public LocalDateTime unmarshall(Class<LocalDateTime> dimensionType, String stringValue) {
            return LocalDateTime.parse(stringValue);
        }
    }
}