环境:
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);
}