ich einen Artikel haben Umwandlung Ich möchte in Dynamo speichern:Jackson Json ObjectMapper nicht verschachtelte ZonedDateTime Beispiel abzubilden, wenn benutzerdefinierte Typen für DynamoDB über benutzerdefinierte Konverter
public class Statement {
@DynamoDBTypeConverted(converter = ListLineItemConverter.class)
private List<LineItem> items;
}
und die Definition von LineItem ist die folgende:
public class LineItem {
private ZonedDateTime dateStart;
private ZonedDateTime dateEnd;
private long balance;
@DynamoDBTypeConverted(converter = ZonedDateTimeConverter.class)
public getDateStart() {...}
@DynamoDBTypeConverted(converter = ZonedDateTimeConverter.class)
public getDateEnd() {...}
}
ich habe für ZonedDateTime einen bekannten Arbeits-Konverter, der ist folgende:
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);
}
}
Und der Konverter funktioniert perfekt, wenn er in einer Basisklasse annotiert ist. Aber ich habe einen benutzerdefinierten Typ, der in einer Liste von Elementen verschachtelt ist, und ich kann nicht herausfinden, wie man DynamoDB dazu bringt, eine geschachtelte ZoneDateTime korrekt zu konvertieren/nicht zu konvertieren.
Ich schrieb sogar einen benutzerdefinierten Konverter für Liste des LineItem ohne Glück:
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");
}
}
}
Es gibt keine Kombination von Anmerkungen, die ich diese Arbeit zu nutzen scheinen, zu erhalten. Ich habe immer bekommen:
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?)
EDIT: Wenn ich die Instanzen von ZonedDateTime
von LineItem
kommentieren Sie dann der Code völlig einwandfrei funktioniert. So DynamoDB hat Schwierigkeiten, das Lesen der @DynamoDBTypeConverted
Anmerkung, wenn es vergraben 3 Ebenen tief:
Statement.items.get[0].dateStart // annotations aren't working at this level
Statement.items.get[0].dateEnd // annotations aren't working at this level