我在我的java应用程序中使用java.time.LocalDateTime。我还尝试使用DynamoDBMapper
并通过注释保存LocalDateTime
变量。不幸的是我收到以下错误:
DynamoDBMappingException: Unsupported type: class java.time.LocalDateTime
有没有办法在不使用DynamoDBMarshalling
的情况下进行此映射?
答案 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);
}
}
}