网上的说法有很多,但都不太全面,本文是通过自己实践后,总结出来的处理方式。自定绑定和自动格式化是两种不同的处理,所以需要针对这两个进行配置,以springboot自带的jackson为例
一、接收参数自动绑定
1、配置一个String转Date的转化器
public class StringToDateConverter implements Converter<String, Date> {
@Override
public Date convert(String source) {
Date target = null;
if(!StringUtils.isEmpty(source)) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
target = format.parse(source);
} catch (ParseException e) {
throw new RuntimeException(String.format("parser %s to Date fail", source));
}
}
return target;
}
}
2、注册该转化器
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addConverter(new StringToDateConverter());
}
}
完成以上两步即可完成普通参数的自动绑定。
在项目中有一种特殊情况是,我们用@RequestBody来接收参数,这时候springboot会使用MappingJackson2HttpMessageConverter来格式化时间,我们还需针对这种情况特殊配置,只需在yml中配置jackson的date-format即可。另外,返回结果时,由于时区问题,可能差8小时,还需配上time-zone。
spring:
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
二、返回结果自动格式化
返回对象时,springboot默认使用的同样是MappingJackson2HttpMessageConverter,配置和上述一致
总结
springboot在接收参数和返回结果时,采用的不同的方式。而且接收普通参数,和接收RequestBody里的参数,也是不同的处理,因为要完全实现入参自动绑定、结果自动格式化,需要配置上述两个地方。