0

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

Antwort

0

Sieht aus wie es ein Problem war, als die Jackson-Parser auf verschachtelte Instanzen ZonedDateTime verwenden und es nicht automatisch Heb es auf.

Ich habe zu der neueren Version von Jackson gewechselt und sogar das JSR310-Modul aufgenommen, um sicherzustellen, dass die Kompatibilität mit dem Marshalling/Unmarshalling der neueren Java-8-Zeit-Konstrukte unterstützt wurde, aber leider.

Weirdly eine Zeile Code es für mich festgelegt:

objectMapper.findAndRegisterModules();

entnommen aus: https://stackoverflow.com/a/37499348/584947

Verwandte Themen