代码之家  ›  专栏  ›  技术社区  ›  deworde

如何更新restemplate以正确映射Java日期?

  •  0
  • deworde  · 技术社区  · 6 年前

    我有个问题 RestTemplate.postForEntity(url, restRequest, RepoResponse.class)

    • 2019-02-01T12:00:00.000-0500

    因为时区中缺少冒号。

    基于 this answer ,看起来我想更改 RestTemplate ObjectMapper .

    https://stackoverflow.com/a/38286322/14250

    这给了我以下代码:

    restTemplate = new RestTemplate();
    ObjectMapper objectMapper = new ObjectMapper();
    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS[XXX][X]");
    objectMapper.setDateFormat(format);
    
    MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter();
    messageConverter.setPrettyPrint(false);
    messageConverter.setObjectMapper(objectMapper);
    restTemplate.getMessageConverters().removeIf(m->m.getClass().getName().equals(MappingJackson2HttpMessageConverter.class.getName()));
    restTemplate.getMessageConverters().add(messageConverter);
    

    不幸的是,我得到了以下错误

    com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `java.time.OffsetDateTime` (no Creators, like default construct, exist): no String-argument constructor/factory method to deserialize from String value ('2019-02-13T12:33:19.179-0500')
    

    0 回复  |  直到 6 年前
        1
  •  1
  •   Michał Ziober    6 年前

    当你和 java.time.* Jackson 最好从注册开始 JavaTimeModule 它来自 jackson-datatype-jsr310

    import com.fasterxml.jackson.annotation.JsonFormat;
    import com.fasterxml.jackson.databind.ObjectMapper;
    import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
    
    import java.time.OffsetDateTime;
    
    public class JsonApp {
    
        public static void main(String[] args) throws Exception {
            JavaTimeModule javaTimeModule = new JavaTimeModule();
    
            ObjectMapper mapper = new ObjectMapper();
            mapper.registerModule(javaTimeModule);
    
            String json = "{\"now\":\"2019-02-01T12:01:01.001-0500\"}";
            System.out.println(mapper.readValue(json, Time.class));
        }
    }
    
    class Time {
    
        @JsonFormat(pattern = "uuuu-MM-dd'T'HH:mm:ss.SSSX")
        private OffsetDateTime now = OffsetDateTime.now();
    
        public OffsetDateTime getNow() {
            return now;
        }
    
        public void setNow(OffsetDateTime now) {
            this.now = now;
        }
    
        @Override
        public String toString() {
            return "PrintObject{" +
                    "now=" + now +
                    '}';
        }
    }
    

    以上代码打印:

    PrintObject{now=2019-02-01T17:01:01.001Z}