解决fegin 日期转换 : Cannot deserialize value of

时间:2025-02-17 22:40:44

 

环境:

springCloud fegin调用

服务端:

返回了一个JSON对象,其中有一个createTime字段,格式是'yyyy-MM-dd HH:mm:ss'。

客户端:

使用对象整体接收参数,其中createTime字段对应类型是。

报错:

: Cannot deserialize value of ......

解决方案一:

import .*;
import ;

/**
 * @author 
 * @date 2018/11/27 15:06
 */
public class MyDateFormat extends DateFormat {
    private DateFormat dateFormat;
    private SimpleDateFormat format1 = new SimpleDateFormat("yyy-MM-dd HH:mm:ss");

    public MyDateFormat(DateFormat dateFormat) {
         = dateFormat;
    }

    @Override
    public StringBuffer format(Date date, StringBuffer toAppendTo, FieldPosition fieldPosition) {
        return (date, toAppendTo, fieldPosition);
    }

    @Override
    public Date parse(String source, ParsePosition pos) {

        Date date = null;
        try {

            date = (source, pos);
        } catch (Exception e) {

            date = (source, pos);
        }
        return date;
    }    // 主要还是装饰这个方法

    @Override
    public Date parse(String source) throws ParseException {

        Date date = null;
        try {
            // 先按我的规则来
            date = (source);
        } catch (Exception e) {            // 不行,那就按原先的规则吧
            date = (source);
        }
        return date;
    }    

}

 

import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import .Jackson2ObjectMapperBuilder;
import .MappingJackson2HttpMessageConverter;

import ;
import ;

@Configuration
public class JacksonConfig {

    @Autowired
    Jackson2ObjectMapperBuilder builder;

    @Bean
    @ConditionalOnMissingBean()
    public ObjectMapper jacksonObjectMapper() {
        ObjectMapper objectMapper = (false).build();

        // 通过该方法对mapper对象进行设置,所有序列化的对象都将按改规则进行系列化
        //  默认
        // Include.NON_DEFAULT 属性为默认值不序列化
        // Include.NON_EMPTY 属性为 空("") 或者为 NULL 都不序列化,则返回的json是没有这个字段的。这样对移动端会更省流量
        // Include.NON_NULL 属性为NULL 不序列化,就是为null的字段不参加序列化
        // (Include.NON_EMPTY);

        // 字段保留,将null值转为""
        ().setNullValueSerializer(new JsonSerializer<Object>() {
            @Override
            public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {
                ("");
            }
        });
        return objectMapper;
    }


    @Bean
    public MappingJackson2HttpMessageConverter MappingJsonpHttpMessageConverter() {

        ObjectMapper mapper = jacksonObjectMapper();
        // ObjectMapper为了保障线程安全性,里面的配置类都是一个不可变的对象
        // 所以这里的setDateFormat的内部原理其实是创建了一个新的配置类
        DateFormat dateFormat = ();
        MyDateFormat dateFormat1 = new MyDateFormat(dateFormat);
        (dateFormat,dateFormat1);
        (dateFormat1);
        MappingJackson2HttpMessageConverter mappingJsonpHttpMessageConverter = new MappingJackson2HttpMessageConverter(
                mapper);
        return mappingJsonpHttpMessageConverter;
    }

问题解决。测试可用。

参考了:/qq906627950/article/details/79503801

和原解决方案大致思路一致,但是原方案有问题,直接使用会报错,我这边做了优化。

 

 

解决方案二:

使用FastJson替换jackson。

@Configuration
public class WebMvcConfigurerImpl implements WebMvcConfigurer {
	
	
	@Bean
    public HttpMessageConverters fastjsonHttpMessageConverter(){
        //定义一个转换消息的对象
        FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();

        //添加fastjson的配置信息 比如 :是否要格式化返回的json数据
        FastJsonConfig fastJsonConfig = new FastJsonConfig();

        ();

        //在转换器中添加配置信息
        (fastJsonConfig);

        HttpMessageConverter<?> converter = fastConverter;

        return new HttpMessageConverters(converter);

    }