2016-09-15 3 views
0

Я использую Spring Boot 1.4 и следующие работы. У меня есть этот @Bean определенно:Дата сопоставления строк с датами, включая время с Джексоном весной

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

И у меня есть этот DTO определен:

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

Я направляющая эти данные в контроллер с @RequestBody ReportRequest со следующим JSON в теле запроса:

{ 
    "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

Это не кажется, что LocalDateTimeDeserializer уважает значение, переданное в setDateFormat(), как можно видеть в JodaModule:

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' не принимает строку. Ему нужен DateTimeFormatter, поэтому я пытаюсь определить, как его правильно обернуть. – Gregg

+0

Так оно и есть. Вы можете создать его из строки с помощью 'DateTimeFormat.forPattern (« yyyy-MM-dd HH: mm: ss »);' – jgm

+0

Вы не можете, потому что этот 'DateTimeFormat' из java.text и' JacksonJodaDateFormat' хочет joda time 'DateTimeFormatter', который работает не так. – Gregg

Смежные вопросы