title: Use Jackson Deserialization for DateTime in Spring REST Controller
body: <p>I am getting this exception when trying to deserialize the value passed on the POST request to the Spring controller from String to OffsetDateTime.</p>
  
  <p>Here is my exception:</p>
  
  <pre><code>Failed to convert value of type 'java.lang.String' to required type 'java.time.OffsetDateTime';
      nested exception is org.springframework.core.convert.ConversionFailedException: 
          Failed to convert from type [java.lang.String] to 
             type [@org.springframework.web.bind.annotation.RequestParam java.time.OffsetDateTime]
             for value '2018-03-02T14:12:50.789+01:00';
             nested exception is java.lang.IllegalArgumentException:
                  Parse attempt failed for value [2018-03-02T14:12:50.789+01:00]
  </code></pre>
  
  <p>I am using the latest version of <a href="https://docs.spring.io/spring-boot/docs/2.0.1.BUILD-SNAPSHOT/reference/htmlsingle/" rel="nofollow noreferrer">Spring-Boot - 2.0.1.BUILD-SNAPSHOT</a></p>
  
  <p>Here is my <code>JacksonConfig.java</code></p>
  
  <pre><code>package com.divinedragon.jackson.config;
  
  import static com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES;
  import static com.fasterxml.jackson.databind.DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL;
  import static com.fasterxml.jackson.databind.PropertyNamingStrategy.SNAKE_CASE;
  import static com.fasterxml.jackson.databind.SerializationFeature.WRAP_ROOT_VALUE;
  
  import org.springframework.context.annotation.Bean;
  import org.springframework.context.annotation.Configuration;
  import org.springframework.context.annotation.Primary;
  
  import com.fasterxml.jackson.databind.ObjectMapper;
  import com.fasterxml.jackson.databind.util.ISO8601DateFormat;
  import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;
  import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
  import com.fasterxml.jackson.module.paramnames.ParameterNamesModule;
  
  @Configuration
  public class JacksonConfig {
  
      @Bean(name = "jacksonConverter")
      public MappingJackson2HttpMessageConverter jacksonConverter(final ObjectMapper objectMapper) {
  
          final MappingJackson2HttpMessageConverter httpMessageConverter = new MappingJackson2HttpMessageConverter();
  
          httpMessageConverter.setObjectMapper(objectMapper);
  
          return httpMessageConverter;
      }
  
      @Bean
      @Primary
      public ObjectMapper objectMapper() {
          final ObjectMapper mapper = new ObjectMapper();
  
          mapper.enable(READ_UNKNOWN_ENUM_VALUES_AS_NULL);
  
          mapper.disable(FAIL_ON_UNKNOWN_PROPERTIES);
          mapper.disable(WRAP_ROOT_VALUE);
  
          mapper.setDateFormat(new ISO8601DateFormat());
          mapper.setPropertyNamingStrategy(SNAKE_CASE);
  
          mapper.registerModule(new Jdk8Module());
          mapper.registerModule(new JavaTimeModule());
          mapper.registerModule(new ParameterNamesModule());
  
          return mapper;
      }
  }
  </code></pre>
  
  <p>And here is my <code>JacksonController.java</code> which is a Spring REST Controller.</p>
  
  <pre><code>package com.divinedragon.jackson.controller;
  
  import java.time.OffsetDateTime;
  import java.util.Collections;
  import java.util.Map;
  
  import org.springframework.web.bind.annotation.GetMapping;
  import org.springframework.web.bind.annotation.PostMapping;
  import org.springframework.web.bind.annotation.RequestParam;
  import org.springframework.web.bind.annotation.RestController;
  
  @RestController
  public class JacksonController {
  
      @GetMapping(path = "/get")
      public Map&lt;String, OffsetDateTime&gt; getDates() {
          return Collections.singletonMap("createdAt", OffsetDateTime.now());
      }
  
      @PostMapping(path = "/post")
      public Map&lt;String, OffsetDateTime&gt; postDates(@RequestParam("created_at") final OffsetDateTime createdAt) {
          return Collections.singletonMap("createdAt", createdAt);
      }
  }
  </code></pre>
  
  <p>This application runs and when I make request to the <code>/get</code> end-point, I get the date value serialized using Jackson correctly.</p>
  
  <pre><code>-&gt; curl -s http://localhost:8080/get | python -m json.tool
  {
      "createdAt": "2018-03-02T14:12:50.789+01:00"
  }
  </code></pre>
  
  <p>When I use the <code>/post</code> end-point and pass the date value, I am getting the above exception:</p>
  
  <pre><code>-&gt; curl -s -X POST http://localhost:8080/post --data-urlencode 'created_at=2018-03-02T14:12:50.789+01:00' | python -m json.tool
  {
      "error": "Bad Request",
      "message": "Failed to convert value of type 'java.lang.String' to required type 'java.time.OffsetDateTime'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@org.springframework.web.bind.annotation.RequestParam java.time.OffsetDateTime] for value '2018-03-02T14:12:50.789+01:00'; nested exception is java.lang.IllegalArgumentException: Parse attempt failed for value [2018-03-02T14:12:50.789+01:00]",
      "path": "/post",
      "status": 400,
      "timestamp": "2018-03-02T13:15:38Z"
  }
  </code></pre>
  
  <p>Can somebody guide me as to how can I have the Jackson deserialization be used for converting the values to OffsetDateTime?</p>