Spring RestTemplate with Jackson as HttpMessageConverter and joda DateTime property fails to deserialize

匿名 (未验证) 提交于 2019-12-03 02:16:02

问题:

The scenario is as follows. I have an ObjectMapper (Jackson 2) that registers a JodaModule, capable of serializing and de-serializing Joda DateTime type. This ObjectMapper is tested with custom JSON strings and works as expected.

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; 

I have an RestTemplateFactory which is responsible for instantiating a RestTemplate, and it sets the previously configured ObjectMapper bean to the 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;   } } 

Now when I contact the webservice it fails to de-serialize the DateTime object with the following error message:

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 

Also the DateTimeDeserializer.class is never called. Anyone has an idea what I am missing here?

回答1:

OK, I was missing this line in my createRestTemplate() method.

restTemplate.setMessageConverters(messageConverters); 


回答2:

Add dependency

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

and use DateTimeDeserializer.class for deserializing as below

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

works fine for me. No need to add a custom message convertor.



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!