• spring boot项目关于LocalDate反序列化失败问题


    在实际项目中,经常接口中会涉及到时间字段,但是不同系统用的时间类也不一样,有些用Date,有些用LocalDate,现在A调B服务时,报错如下:

    Caused by: org.springframework.http.converter.HttpMessageConversionException: Type definition error: [simple type, class java.time.LocalDate]; nested exception is com.fasterxml.jackson.databind.exc.
    InvalidDefinitionException: Cannot construct instance of `java.time.LocalDate` (no Creators, like default construct, exist): no String-argument constructor/factory method to deserialize from String value ('2019-12-06') at

    其实解决这个问题也很简单,想办法让其反序列化成功就行。

    一、添加jar包

    <dependency>
      <groupId>com.fasterxml.jackson.datatype</groupId>
      <artifactId>jackson-datatype-jsr310</artifactId>
      <version>2.9.7</version>
    </dependency>

    二、加配置

    import com.fasterxml.jackson.databind.DeserializationFeature;
    import com.fasterxml.jackson.databind.ObjectMapper;
    import com.fasterxml.jackson.databind.SerializationFeature;
    import com.fasterxml.jackson.databind.module.SimpleModule;
    import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
    import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
    import org.springframework.context.annotation.Bean;
    import org.springframework.stereotype.Component;
    
    @Component
    public class JsonObjectMapperConfig {
    
        @Bean
        public ObjectMapper ObjectMapper(){
            SimpleModule simpleModule = new SimpleModule();
            simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
            simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
            ObjectMapper objectMapper = new ObjectMapper();
            objectMapper.registerModule(simpleModule);
            objectMapper.registerModule(new JavaTimeModule());
            objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
            objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
            return objectMapper;
        }
    }

    然后问题就可以解决了。

    三、说明

    1、ObjectMapper

    Jackson ObjectMapper类(com.fasterxml.jackson.databind.ObjectMapper)是使用Jackson解析JSON最简单的方法;
    Jackson ObjectMapper可以从字符串、流或文件解析JSON,并创建Java对象或对象图来表示已解析的JSON。将JSON解析为Java对象也称为从JSON反序列化Java对象;
    Jackson ObjectMapper也可以从Java对象创建JSON. 从Java对象生成JSON的过程也被称为序列化Java对象到JSON;
    Jackson对象映射器(Object Mapper)可以把JSON解析为用户自定义类对象, 或者解析为JSON内置的树模型的对象;

    说白了,就是将json与java对象之间互相转换。

    2、配置解释

        @Bean
        public ObjectMapper ObjectMapper(){
            // 可以将各种Module注册到ObjectMapper中,每个Module中可以包含多个反序列化组件
            SimpleModule simpleModule = new SimpleModule();
            // 添加将long转成String的组件
            simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
            simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
            ObjectMapper objectMapper = new ObjectMapper();
            objectMapper.registerModule(simpleModule);
            // 将时间反序列化组件添加到ObjectMapper中
            objectMapper.registerModule(new JavaTimeModule());
            // 禁止将时间类型数据转换成时间戳
            objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
            objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
            return objectMapper;
        }

    再来看看JavaTimeModule

     就是添加各种跟时间类型有关的序列化以及反序列化组件。

    如果想给予我更多的鼓励,求打

    因为,我的写作热情也离不开您的肯定支持,感谢您的阅读,我是【阿里马云】!

  • 相关阅读:
    java开发划分级别的标准
    MySql数据的插入-replace into
    通过DOS命令批量重命名文件
    jira-6.0.1-x64下载地址
    nagiosQL访问时报错PHP message: PHP Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead
    shell-保留文件系统下剩余指定数目的文件
    -bash:fork:cannot allocate memory
    HttpWatch手把手图解教程
    HttpWatch Professional Edition 7.2.13下载含( license.lic )
    Resize CentOS Linux hard drive partition (centos 6.3 调整LVS磁盘大小)
  • 原文地址:https://www.cnblogs.com/alimayun/p/14707853.html
Copyright © 2020-2023  润新知