0

私はダイナモで保存したいカスタムコンバータを介して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

答えて

0

が見えると、それ:だからDynamoDBのは、それが深い3つのレベルを埋めていますとき、トラブル@DynamoDBTypeConverted注釈を読み込むをしていますそれを拾う。

私は新しいバージョンのジャクソンに切り替えました。さらにJSR310モジュールを組み込んで、より新しいJava 8時間構造のマーシャリング/アンマーシャリングとの互換性がサポートされていることを保証しました。コードの

変なふう一行は私のためにそれを修正:https://stackoverflow.com/a/37499348/584947

objectMapper.findAndRegisterModules();

から取ら

関連する問題