Ok я, наконец, нашел решение. Это не самый элегантный, я бы скорее зарегистрировал настраиваемый объект mapper в application context.xml, но не смог получить эту работу.
В любом случае причина, по которой я получаю UTC во время десериализации, так это то, что DateTime десериализатор поставляется Джексон намеренно делает:
public ReadableInstant deserialize(JsonParser jp, DeserializationContext ctxt)
throws IOException, JsonProcessingException
{
JsonToken t = jp.getCurrentToken();
if(t == JsonToken.VALUE_NUMBER_INT)
return new DateTime(jp.getLongValue(), DateTimeZone.UTC);
if(t == JsonToken.VALUE_STRING)
{
String str = jp.getText().trim();
if(str.length() == 0)
return null;
else
return new DateTime(str, DateTimeZone.UTC);
} else
{
throw ctxt.mappingException(getValueClass());
}
}
Так что я создал Mapper пользовательских объектов
public class CustomObjectMapper extends ObjectMapper {
public CustomObjectMapper() {
SimpleModule module = new SimpleModule("DateTime", Version.unknownVersion());
module.addDeserializer(DateTime.class, new dateDeserializer());
super.registerModule(module);
}
public class dateDeserializer extends JsonDeserializer<DateTime> {
@Override
public DateTime deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
JsonToken t = jp.getCurrentToken();
String str = jp.getText().trim();
if (str.length() == 0) {
return null;
}
else {
DateTimeFormatter formatter = ISODateTimeFormat.dateTime().withOffsetParsed();
return formatter.parseDateTime(str);
}
}
}
}
А затем регистрируется это с остальной шаблон
private MappingJacksonHttpMessageConverter mappingJacksonHttpMessageConverter() {
MappingJacksonHttpMessageConverter converter = new MappingJacksonHttpMessageConverter();
converter.setObjectMapper(new CustomObjectMapper());
return converter;
}
restTemplate.getMessageConverters().add(0, mappingJacksonHttpMessageConverter());
Если кто имеет какие-либо улучшения или мысли по этому поводу хотелось бы услышать их.
Спасибо,
Kenny
Как преобразовать в DateTime? Можете ли вы добавить свой сериализатор к своему вопросу? – vtor
Извините, что не вернусь к вам раньше, я был в отпуске. Я использую Spring restTemplate.exchange, который под капотом использует Jackson для десериализации. Я считаю, что мне нужно добавить настраиваемый объект mapper для Jackson для обработки dateTime, поскольку значение по умолчанию теряет локальную информацию о времени и просто преобразуется в UTC. Я еще не сделал этого, но попробую это сейчас и обновить, когда закончите. – km2000