Spring RestTemplate с Jackson как свойство HttpMessageConverter и joda DateTime не может десериализоваться - программирование
Подтвердить что ты не робот

Spring RestTemplate с Jackson как свойство HttpMessageConverter и joda DateTime не может десериализоваться

Сценарий выглядит следующим образом. У меня есть ObjectMapper (Jackson 2), который регистрирует JodaModule, способный сериализовать и де-сериализовать тип Joda DateTime. Этот ObjectMapper протестирован с пользовательскими строками JSON и работает как ожидалось.

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(new JodaModule());
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
objectMapper.setTimeZone(TimeZone.getTimeZone("GMT+1:00"));
objectMapper.setDateFormat(new ISO8601DateFormat());
objectMapper.enable(SerializationFeature.INDENT_OUTPUT);
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
return objectMapper;

У меня есть RestTemplateFactory, который отвечает за создание экземпляра RestTemplate и устанавливает ранее настроенный ObjectMapper bean на RestTemplate.

@Configuration
public class RestTemplateFactory {

  @Autowired
  private ObjectMapper objectMapper;

  @Bean
  public RestTemplate createRestTemplate() {
    RestTemplate restTemplate = new RestTemplate();
    List<HttpMessageConverter<?>> messageConverters = new ArrayList<>();
    MappingJackson2HttpMessageConverter jsonMessageConverter = new MappingJackson2HttpMessageConverter();
    jsonMessageConverter.setObjectMapper(objectMapper);
    messageConverters.add(jsonMessageConverter);
    // restTemplate.setMessageConverters(messageConverters); // This line was missing, but needs to be here. See answer.
    return restTemplate;
  }
}

Теперь, когда я обращаюсь к веб-сервису, он не может дезацинировать объект DateTime со следующим сообщением об ошибке:

org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON: Can not instantiate value of type [simple type, class org.joda.time.DateTime] from String value; no single-String constructor/factory method

Также DateTimeDeserializer.class никогда не вызывается. У кого-то есть представление о том, что мне здесь не хватает?

4b9b3361

Ответ 1

ОК, я пропустил эту строку в моем методе createRestTemplate().

restTemplate.setMessageConverters(messageConverters);

Ответ 2

Добавить зависимость

      <dependency>
        <groupId>com.fasterxml.jackson.datatype</groupId>
        <artifactId>jackson-datatype-joda</artifactId>
        <version>2.9.0.pr4</version>
    </dependency>

и используйте DateTimeDeserializer.class для десериализации, как показано ниже

@JsonDeserialize(using = DateTimeDeserializer.class)
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd.MM.yyyy", timezone = "Europe/Berlin")
private DateTime date;

отлично работает для меня. Не нужно добавлять настраиваемый конвертер сообщений.