2016-09-15 3 views
0

私はSpring Boot 1.4を使用しています。私はこの@Beanが定義されている:私は、要求の本文に以下のJSONで@RequestBody ReportRequestとコントローラにこのデータを提出していSpringでジャクソンと日付を含む日付文字列を日付にマッピングする

public class ReportRequest implements Serializable { 
    private LocalDate startDate; 
    private LocalDate endDate; 
    // additional fields and getters/setters omitted 
} 

@Bean 
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() { 
    ObjectMapper mapper = new ObjectMapper(); 
    mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd")); 
    mapper.registerModule(new JodaModule()); 
    return new MappingJackson2HttpMessageConverter(mapper); 
} 

そして、私はこのDTOが定義されている

{ 
    "startDate": "2016-09-01", 
    "endDate": "2016-09-12" 
} 

素晴らしいです。しかし、私はまた時間を含める必要があります。だから私はこのようにすべてを変更しました:

mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")); 

private LocalDateTime startDate; 
private LocalDateTime endDate; 

{ 
    "startDate": "2016-09-01 02:00:00", 
    "endDate": "2016-09-12 23:59:59" 
} 

これは動作しません。私は次のように変更:

Could not read document: Invalid format: \"2016-09-01 02:00:00\" is malformed at \" 02:00:00\" (through reference chain: com.hightouchinc.dto.ReportRequest[\"startDate\"]); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Invalid format: \"2016-09-01 02:00:00\" is malformed at \" 02:00:00\" (through reference chain: com.hightouchinc.dto.ReportRequest[\"startDate\"]) 

更新:私は取得しています

mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss")); 

そして"2016-09-01T02:00:00"を送信することができ、それが動作します。しかし、両方からTを削除することは壊れていきます。

答えて

1

JodaModuleに見られるようにLocalDateTimeDeserializersetDateFormat()に渡された値、ということは表示されません。

addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer()); 

何ができるか、それを登録する前に、モジュールのデフォルトデシリアライザをオーバーライドしています

JodaModule jodaModule = new JodaModule(); 
JacksonJodaDateFormat format = new JacksonJodaDateFormat("yyyy-MM-dd HH:mm:ss"); 
jodaModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(format))); 
mapper.registerModule(jodaModule); 

これは正しいパターンを使用してLocalDateTimeインスタンスを逆シリアル化する必要があります。

+0

これはいい考えですが、 'JacksonJodaDateFormat'はStringを受け入れません。私はそれを正しくラップする方法を決定しようとしているので、DateTimeFormatterが必要です。 – Gregg

+0

そうです。 'DateTimeFormat.forPattern(" yyyy-MM-dd HH:mm:ss "); ' – jgm

+0

の文字列から作成することはできます。' DateTimeFormat'はjava.textに由来し、 'JacksonJodaDateFormat'は同じ方法で動作しないjoda時間 'DateTimeFormatter' – Gregg

関連する問題