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); 
    } 
} 
,369 :

public class LineItem { 
private ZonedDateTime dateStart; 
private ZonedDateTime dateEnd; 
private long balance; 

@DynamoDBTypeConverted(converter = ZonedDateTimeConverter.class) 
public getDateStart() {...} 

@DynamoDBTypeConverted(converter = ZonedDateTimeConverter.class) 
public getDateEnd() {...} 
} 

는 I는 다음과 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의 인스턴스를 주석 경우 코드가 완전히 잘 작동합니다. 이 깊은 3 단계 묻혀 그래서 DynamoDB의는 문제가 @DynamoDBTypeConverted 주석을 읽는 데 :

Statement.items.get[0].dateStart // annotations aren't working at this level

자동이없는 ZonedDateTime의 중첩 인스턴스에서 잭슨 파서를 사용할 때 문제이고 같은

Statement.items.get[0].dateEnd // annotations aren't working at this level

답변

0

이 보이는 그것을 집어들.

필자는 최신 버전의 Jackson으로 전환했으며 JSR310 모듈을 포함하여 새로운 8 시간 구조의 마샬링/언 마샬링과의 호환성이 지원되었지만 슬프게도 지원합니다. 코드의

이상하게 한 줄이 나를 위해 그것을 고정 : https://stackoverflow.com/a/37499348/584947

:

objectMapper.findAndRegisterModules();

은 촬영