1. get请求和post表单请求中如果含有时间字符串,则spring底层是用的ParameterConversionService这个参数解析器去转换的
2. post的json请求时, spring底层默认用的是Jackson的HttpMessagConverter去做的序列化
根据不同请求方式,做不同的日期时间格式配置处理

 1. GET请求及POST表单请求(RequestParam和PathVariable参数):
        - 配置Converter<String, T>转换器实现参数转换, 该转换器bean会注入到spring
mvc的参数解析器中(ParameterConversionService)

2. POST-application/json请求(RequestBody参数)
        --
配置ObjectMapper(这个玩意儿会注入到Jackson的HttpMessagConverter里面,即MappingJackson2HttpMessageConverter中)来实现Json格式数据的序列化和反序列化

 
@Configuration public class DateHandlerConfig { /** * 默认日期时间格式 */ private
static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss"; /** *
默认日期格式 */ private static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd"; /** *
默认时间格式 */ private static final String DEFAULT_TIME_FORMAT = "HH:mm:ss"; /** *
Date转换器 * 采用hutool的日期解析工具类Dateutil可以匹配任意格式日期字符串 */ @Bean public
Converter<String, Date> dateConverter() { return new Converter<String, Date>()
{ @Override public Date convert(String source) { return
DateUtil.parse(source.trim()); } }; } /** * LocalDate转换器 */ @Bean public
Converter<String, LocalDate> localDateConverter() { return new
Converter<String, LocalDate>() { @Override public LocalDate convert(String
source) { return LocalDate.parse(source,
DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)); } }; } /** * LocalTime转换器 */
@Bean public Converter<String, LocalTime> localTimeConverter() { return new
Converter<String, LocalTime>() { @Override public LocalTime convert(String
source) { return LocalTime.parse(source,
DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)); } }; } /** *
LocalDateTime转换器 */ @Bean public Converter<String, LocalDateTime>
localDateTimeConverter() { return new Converter<String, LocalDateTime>() {
@Override public LocalDateTime convert(String source) { return
LocalDateTime.parse(source,
DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)); } }; } /** *
Json序列化和反序列化转换器 */ @Bean public ObjectMapper objectMapper() { ObjectMapper
objectMapper = new ObjectMapper(); //java8日期 Local系列序列化和反序列化模块 JavaTimeModule
javaTimeModule = new JavaTimeModule();
javaTimeModule.addSerializer(LocalDateTime.class, new
LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)));
javaTimeModule.addSerializer(LocalDate.class, new
LocalDateSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)));
javaTimeModule.addSerializer(LocalTime.class, new
LocalTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)));
javaTimeModule.addDeserializer(LocalDateTime.class, new
LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)));
javaTimeModule.addDeserializer(LocalDate.class, new
LocalDateDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)));
javaTimeModule.addDeserializer(LocalTime.class, new
LocalTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)));
objectMapper.registerModule(new ParameterNamesModule()).registerModule(new
Jdk8Module()).registerModule(javaTimeModule);
objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
objectMapper.disable(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE);
// 忽略json字符串中不识别的属性
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,
false); // 忽略无法转换的对象
objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); //
PrettyPrinter 格式化输出 objectMapper.configure(SerializationFeature.INDENT_OUTPUT,
true); // NULL不参与序列化
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); // 指定时区
objectMapper.setTimeZone(TimeZone.getTimeZone("GMT+8:00")); /** *
Date日期类型字符串全局处理, 默认格式为:yyyy-MM-dd HH:mm:ss * 局部处理某个Date属性字段接收或返回日期格式yyyy-MM-dd,
可采用@JsonFormat(pattern = "yyyy-MM-dd", timezone="GMT+8")注解标注该属性 */
objectMapper.setDateFormat(new SimpleDateFormat(DEFAULT_DATE_TIME_FORMAT));
return objectMapper; } }
注意点:
* 局部日期格式化处理: * --以上ObjectMapper配置默认json请求中的Date会转化成yyyy-MM-dd HH:mm:ss格式 *
--如果需要接收或返回是yyyy-MM-dd格式, 采用@JsonFormat(pattern = "yyyy-MM-dd",
timezone="GMT+8")注解单独标注该实体类属性即可
解决问题:

1.支持请求入参String转Date, 支持get, post(表单 或 json)请求

2. 支持返回数据为Date类型的转为日期时间String

3. 支持Java8日期API, 如: LocalTime, LocalDate, LocalDateTime

4. 支持局部修改日期时间的接收和返回格式 

如果以上配置不生效,新增如下配置:
@Configuration public class WebMvcConfig implements WebMvcConfigurer {
@Resource private ObjectMapper objectMapper; @Override public void
configureMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.removeIf(o -> o instanceof MappingJackson2HttpMessageConverter);
converters.add(new MappingJackson2HttpMessageConverter(objectMapper)); } }
 

技术
下载桌面版
GitHub
Gitee
SourceForge
百度网盘(提取码:draw)
云服务器优惠
华为云优惠券
腾讯云优惠券
阿里云优惠券
Vultr优惠券
站点信息
问题反馈
邮箱:[email protected]
吐槽一下
QQ群:766591547
关注微信