私はダイナモで保存したいカスタムコンバータを介してDynamoDBのためのカスタムタイプを変換する際に、ネストされたZonedDateTimeインスタンスをマップするために失敗します。ジャクソンJSON ObjectMapperは、私はアイテムを持っている
public class ZonedDateTimeConverter implements DynamoDBTypeConverter<String, ZonedDateTime> {
public ZonedDateTimeConverter(){}
@Override
public String convert(final ZonedDateTime time) {
return time.toString();
}
@Override
public ZonedDateTime unconvert(final String stringValue) {
return ZonedDateTime.parse(stringValue);
}
}
:
public class LineItem {
private ZonedDateTime dateStart;
private ZonedDateTime dateEnd;
private long balance;
@DynamoDBTypeConverted(converter = ZonedDateTimeConverter.class)
public getDateStart() {...}
@DynamoDBTypeConverted(converter = ZonedDateTimeConverter.class)
public getDateEnd() {...}
}
は、私は次のようであるZonedDateTimeのための既知の作業コンバータを使用してきました
そして、コンバーターは基本クラスにアノテートされていると完全に動作します。しかし、アイテムのリストにネストされたカスタムタイプがあり、DynamoDBにネストされたZonedDateTimeを正しく変換/変換解除する方法を見つけることができません。
私も運なしのLineItemのリストのカスタムコンバータを書いた:
public class ListLineItemConverter implements DynamoDBTypeConverter<String, List<LineItem>> {
private ObjectMapper objectMapper;
public ListLineItemConverter() {
objectMapper = new ObjectMapper();
objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
// THIS LINE OF CODE FIXED THE ISSUE FOR ME
objectMapper.findAndRegisterModules();
// THIS LINE OF CODE FIXED THE ISSUE FOR ME
}
@Override
public String convert(List<LineItem> object) {
try {
String result = objectMapper.writeValueAsString(object);
return objectMapper.writeValueAsString(object);
} catch (JsonProcessingException e) {
throw new RuntimeException("bad json marshalling");
}
}
@Override
public List<LineItem> unconvert(String object) {
try {
return objectMapper.readValue(object, new TypeReference<List<LineItem>>() {});
} catch (IOException e) {
throw new RuntimeException("bad json unmarshalling");
}
}
}
私はこの作業を取得するために使用するように見えることができ、注釈のない組み合わせがありません。私は常に取得:
com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of java.time.ZonedDateTime: no suitable constructor found, can not deserialize from Object value (missing default constructor or creator, or perhaps need to add/enable type information?)
編集:私はLineItem
からZonedDateTime
のインスタンスをコメントアウトした場合、コードは完全に正常に動作します。自動的にない問題があったようZonedDateTimeのネストされたインスタンス上のジャクソンパーサーを使用している場合
Statement.items.get[0].dateStart // annotations aren't working at this level
Statement.items.get[0].dateEnd // annotations aren't working at this level