springboot序列化反序列化中,Date与Long类型转化问题⼀、response body 序列化Date与Long为String
⽅法1-配置 ResponseBody 中 Date 序列化
在l中增加如下配置:
spring:
jackson:
time-zone: GMT+8
date-format: yyyy-MM-dd HH:mm:ss
注意:该⽅法只针对于 springboo t默认的 jackson 序列化才有效,并且该⽅法只能配置⽇期相关
⽅法2-⾃定义序列化ObjectMap
@Configuration
public class WebMvcConfiguration implements WebMvcConfigurer {
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters){
for(HttpMessageConverter httpMessageConverter : converters){
if(httpMessageConverter instanceof MappingJackson2HttpMessageConverter){
((MappingJackson2HttpMessageConverter) httpMessageConverter).setObjectMapper(new JacksonMapper());
}
}
}
}
public class JacksonMapper extends ObjectMapper {
public JacksonMapper(){
super();
// null 值属性也序列化
this.setSerializationInclusion(JsonInclude.Include.ALWAYS);
// Long 值转string,解决前端因 Long 值太⼤⽽损失精度问题
SimpleModule simpleModule =new SimpleModule();
simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
simpleModule.addSerializer(long.class, ToStringSerializer.instance);
/
/设置⽇期格式
SimpleDateFormat smt =new SimpleDateFormat("yyyy-MM-dd");
setDateFormat(smt);
registerModule(simpleModule);
}
}
注意:该⽅法只针对于 springboo t默认的 jackson 序列化才有效,并且会覆盖⽅法⼀中的配置
⽅法三-注册MappingJackson2HttpMessageConverter对象
@Bean
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter(){
return new MappingJackson2HttpMessageConverter(new JacksonMapper());
}
JacksonMapper 类同⽅法⼆
注意:该⽅法只针对于 springboo t默认的 jackson 序列化才有效,并且会覆盖⽅法⼀中的配置
说明:⽅法⼆与⽅法三是在org.verter.HttpMessageConverter层⾯,重构ObjectMap对象的⽅式
⽅法四-注册org.springframework.boot.autoconfigure.http.HttpMessageConverters对象
@Bean
public HttpMessageConverters useConverters(){
// 1.需要定义⼀个convert转换消息的对象;
FastJsonHttpMessageConverter fastJsonHttpMessageConverter =new FastJsonHttpMessageConverter();
// 2:添加fastJson的配置信息;
FastJsonConfig fastJsonConfig =new FastJsonConfig();
fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat,
SerializerFeature.DisableCircularReferenceDetect, SerializerFeature.WriteMapNullValue);
fastJsonConfig.setDateFormat("yyyy-mm-dd");
SerializeConfig serializeConfig = SerializeConfig.globalInstance;
serializeConfig.put(Long.class, ToStringSerializer.instance);
serializeConfig.put(Long.TYPE , ToStringSerializer.instance);
fastJsonConfig.setSerializeConfig(serializeConfig);
// 3处理中⽂乱码问题
List<MediaType> fastMediaTypes =new ArrayList<>();
fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
/
/ 4.在convert中添加配置信息.
fastJsonHttpMessageConverter.setSupportedMediaTypes(fastMediaTypes);
fastJsonHttpMessageConverter.setFastJsonConfig(fastJsonConfig);
HttpMessageConverter<?> converter = fastJsonHttpMessageConverter;
return new HttpMessageConverters(converter);
}
注意:该⽅法是替换 springboot 默认的 jackson 序列化⽅式,采⽤ fastjson ⽅式序列化
说明:⽅法⼆三四是在不同的层⾯解决序列化问题,不同的序列化⽅式都可以在这两个层⾯着⼿解决序列化问题,在这⾥我就不⼀⼀写明,⼤家举⼀反三即可。
⼆、RequestMapping 时,将前端字符串格式的Date参数反序列化解析
该问题解决只需要实现verter.Converter接⼝即可
@Slf4j
@Component
string转date的方法public class DateConverter implements Converter<String, Date>{ @Override
public Date convert(String source){
if(StringUtils.isBlank(source)){
return null;
}
if(source.matches("^\\d{4}-\\d{1,2}-\\d{1,2}$")){
return im(),"yyyy-MM-dd");
}
if(source.matches("^\\d{4}-\\d{1,2}-\\d{1,2} {1}\\d{1,2}:\\d{1,2}:\\d{1,2}$")){
return im(),"yyyy-MM-dd HH:mm:ss");
}
throw new IllegalArgumentException("Invalid value '"+ source +"'");
}
public Date parseDate(String dateStr, String format){
Date date = null;
try{
date =new SimpleDateFormat(format).parse(dateStr);
}catch(ParseException e){
log.warn("转换{}为⽇期(pattern={})错误!", dateStr, format);
}
return date;
}
}
注意:Converter接⼝中泛型前⼀个是指原类型,后⼀个是⽬标类型说明:同理,其他类型的转化也是时间该接⼝即可,⼤家举⼀反三

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。