Spring @DateTimeFormat日期格式化时注解浅析分享
创始人
2024-02-06 06:37:42
0

文章目录

    • 总结写前面
    • 为什么用
    • 怎么用
      • 场景一
      • 场景二
      • 场景三
      • 场景四
      • 场景五
        • 方式一
        • 方式二

总结写前面

关于它 @DateTimeFormat

  1. 可以接收解析前端传入字符时间数据;
  2. 不能格式化接收的字符时间类型数据,需要的转换格式得配置;
  3. 入参格式必须与后端注解格式保持一致,否则会报错;

为什么用

场景:跟前端交互时,接收字符类型的时间值,就需要使用 @DateTimeFormat 注解来解析,否则就会报错;

@RestController
@RequestMapping("/demo")
public class DemoTestController {@PostMapping("/testOne")public DemoTest testOne(DemoTest demoTest){return demoTest;}
}@Data
public class DemoTest {private Date nowTime;
}

请求示例结果:

Resolved [org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errorsField error in object 'demoTest' on field 'nowTime': rejected value [2022-11-20 16:42:26,2022-11-20 16:42:01]; codes [typeMismatch.demoTest.nowTime,typeMismatch.nowTime,typeMismatch.java.util.Date,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [demoTest.nowTime,nowTime]; arguments []; default message [nowTime]]; default message [Failed to convert property value of type 'java.lang.String[]' to required type 'java.util.Date' for property 'nowTime'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [java.util.Date] for value '2022-11-20 16:42:26'; nested exception is java.lang.IllegalArgumentException]]

怎么用

场景一

接收非 JSON 格式请求参数。

@RestController
@RequestMapping("/demo")
public class DemoTestController {@PostMapping("/testOne")public DemoTest testOne(DemoTest demoTest){return demoTest;}
}@Data
public class DemoTest {@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")private Date nowTime;
}

请求示例结果:

  • 请求:POST

  • 数据格式:form-data
    在这里插入图片描述

从结果可以看出,@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") 可以保证接收解析前端传入的字符时间参数,但是并不能完成时间格式化操作,如果需要获取想要的时间格式,是需要自己手动转换的。

场景二

接收 JSON 格式请求数据,与场景一的区别是请求的数据格式:

  • 场景一:form-data
  • 场景二:JSON
@RestController
@RequestMapping("/demo")
public class DemoTestController {@PostMapping("/testTwo")public DemoTest testTwo(DemoTest demoTest){return demoTest;}
}@Data
public class DemoTest {@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")private Date nowTime;
}

请求示例结果:

  • 请求:POST

  • 数据格式:JSON
    在这里插入图片描述

从结果可以看出,返回数据 nowTime 是空的,因为这里的Controller层没有使用 @RequestBody 去接收 JSON 格式的数据,而 Spring 默认的转换器类型是不包含 JSON 的(有兴趣的可以看下 org.springframework.core.convert.support 包,这里面包含Spring支持的默认转换器)。

场景三

场景三跟场景二的区别就是,在 Controller 层方法入参配合使用 @RequestBody 去接收 JSON 格式,使用该注解会自动调用对应的JSON转换器。

@RestController
@RequestMapping("/demo")
public class DemoTestController {@PostMapping("/testThree")public DemoTest testThree(@RequestBody DemoTest demoTest){return demoTest;}
}@Data
public class DemoTest {@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")private Date nowTime;
}

请求示例结果:

  • 请求:POST

  • 数据格式:JSON在这里插入图片描述

这里可以看到,请求报错400,导致400的原因比较多,这里只说明一下场景三,场景三中使用 @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") 注解格式与请求入参格式不一致,所以会导致请求报错;

在这里插入图片描述

大概意思就是说,Spring 框架在尝试转换参数的过程中,没有找到合适接收格式导致转换失败。(注意!注意!注意!讲三遍,所以前端入参格式必须与后端约定格式保持一致,否则会报错)。

场景四

场景四的目的是为了解决场景一中时间格式化的问题。

关于 @JsonFormat 注解,可以看看我的另一篇blog中有做分享,感兴趣的大佬可以去看看,附上传送门:@JsonFormat 和 @DateTimeFormat 时间格式化注解详解(不看血亏)

@RestController
@RequestMapping("/demo")
public class DemoTestController {@PostMapping("/testThree")public DemoTest testThree(@RequestBody DemoTest demoTest){return demoTest;}
}@Data
public class DemoTest {@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")private Date nowTime;
}

请求示例结果:

  • 请求:POST

  • 数据格式:form-data在这里插入图片描述

场景五

方式一

针对场景四的数据请求格式是 form-data,场景五来说明 JSON 同样适用。

@RestController
@RequestMapping("/demo")
public class DemoTestController {@PostMapping("/testThree")public DemoTest testThree(@RequestBody DemoTest demoTest){return demoTest;}
}@Data
public class DemoTest {@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")private Date nowTime;
}

请求示例结果:

  • 请求:POST

  • 数据格式:JSON
    在这里插入图片描述

方式二

可以继承 Spring 提供的org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer 来进行全局配置。

@RestController
@RequestMapping("/demo")
public class DemoTestController {@PostMapping("/testThree")public DemoTest testThree(@RequestBody DemoTest demoTest){return demoTest;}
}@Data
public class DemoTest {@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")private Date nowTime;
}@Configuration
public class CustomsDateConvert implements Jackson2ObjectMapperBuilderCustomizer {@Overridepublic void customize(Jackson2ObjectMapperBuilder jacksonObjectMapperBuilder) {String dateFormat = "yyyy-MM-dd HH";// 针对于Date类型,文本格式化jacksonObjectMapperBuilder.simpleDateFormat(dateFormat);// 针对于JDK新时间类。序列化时带有T的问题,自定义格式化字符串JavaTimeModule javaTimeModule = new JavaTimeModule();javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(dateFormat)));javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(dateFormat)));jacksonObjectMapperBuilder.modules(javaTimeModule);}
}/*** 解决Jackson2ObjectMapperBuilderCustomizer失效问题*/
@Configuration
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
public class ConvertConfiguration implements WebMvcConfigurer {@Autowired(required = false)private MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter;@Overridepublic void extendMessageConverters(List> converters) {converters.removeIf(converter -> converter instanceof MappingJackson2HttpMessageConverter);if (Objects.isNull(mappingJackson2HttpMessageConverter)) {converters.add(0, new MappingJackson2HttpMessageConverter());} else {converters.add(0, mappingJackson2HttpMessageConverter);}}
}

请求示例结果:

  • 请求:POST

  • 数据格式:JSON
    在这里插入图片描述


感 谢各 位大 佬的 阅读,随手 点赞,日薪 过万~!!!

相关内容

热门资讯

“国潮范”闪耀世运,巴蜀魅力璀...   蜀绣飞针,绣出芙蓉叠影  竹编经纬,勾勒山水清韵  青铜不语,叩响古蜀秘境  川剧变脸,刹那烟火...
(抗战胜利80周年)访台湾雾峰...   在台湾台中市,有一处具百余年历史的建筑群——雾峰林家宅园。这里不仅是知名望族居所,也记录着雾峰林...
赏古乐、做扎染……这个暑假沉浸...   眼下正值暑期,各地依托非遗场馆和资源,开展内容丰富的传统文化体验、普及活动,让人们在沉浸式体验中...
小“票根”如何成为激活消费的“...   原标题:小“票根”成为“金钥匙”(新视窗·新供给引领新消费新需求)  在江苏南京溧水区天生桥景区...
【世界说】美国学者:于美国35...   中国日报网8月6日电 澳大利亚“对话”新闻网(The Conversation)4日刊发文章称,...
铭记历史 缅怀先烈 | 红色底...   央视网消息:铭记历史、缅怀英烈,今天(8月6日)的《抗日根据地·今昔巨变》系列报道,我们聚焦鄂豫...
决胜“十四五” 打好收官战|路...   交通,是经济发展的强劲引擎,也是联通万家的民生通途。  “十四五”期间,我国“6轴7廊8通道”国...
丈夫因为没吃到鸡蛋不停抱怨 最...   四川一女子做了一大桌菜,丈夫因鸡蛋被侄子吃了,没吃到鸡蛋喋喋不休抱怨,最终女子崩溃掀桌。(编辑 ...
女子商场掀门帘的瞬间 小偷从背...   8月6日(发布),两女子在商场门口趁顾客掀帘子从背后2秒就偷走手机,目前失主已报案。(编辑:杨杨...
聚焦暑期安全:警惕不法分子利用...   原标题:租借学生微信号、盗取儿童电话卡、以“兼职”名义诱导拨打诈骗电话  警惕!不法分子利用中小...