yyyymmddhhmmss转换为日期_如何在spring mvc restful接口中定制化类型转换和格式化

7f87ba2bbef041f8e32472eb67c2496b.png

1.痛点

最近小胖哥搞了个小程序,有几个spring mvc restful接口传递了时间,时间用java 8 time 相关的api 来直接接收:

786053ae42e5ed57e72f4c1aea964b99.png

当使用根据ISO 8601格式化的参数向任何这些方法发送POST请求时,报出了如下异常:

44c0580ad2cc439d42daa172e81cf247.png

这是因为默认情况下Spring不能将String参数转换为任何日期或时间对象。下面小胖哥就来带大家来搞一搞如何在spring mvc中进行类型转换和格式化操作,webflux也是同样的机制。多多关注码农小胖哥,更多it知识分享。

2.在请求级别转换日期参数

其中的一个解决方案是使用@DateTimeFormat 注释注释参数 并提供格式设置模式参数,我们将上面的方法改动一下:

daf44c864c16e3d4d083f2260b1aeec6.png

这样,如果使用ISO 8601格式格式化字符串,则字符串将正确转换为日期对象。

我们也可以使用自己的转换模式。我们可以在@DateTimeFormat注释中提供一个模式参数 :

36dfb051fb43cb15678205c3fd2d42bd.png

3.在应用程序级别转换日期参数

在Spring中处理日期和时间对象转换的另一种方法是提供全局配置。我们可以通过自动化配置类WebMvcAutoConfiguration中找到相关的处理机制:

3600f1c6794b135e0d19476e858b0c1e.png

重点是该类的参数:

10118cc3c1397fbc0d0eb2b16019c957.png

我们指定了格式就可以自动转换了。通过此约定配置我们可以指定一个统一的处理风格。我们注意到在初始化FormattingConversionService调用了addFormatters(FormatterRegistry registry),我们找到了该方法的具体实现:

23b289e0e8ca78e60e075531e29a35ca.png

我们发现Converter、GenericConverter、Formatter 三种类型的的Spring bean 都可以被自动注入到格式化注册机中去。当然只要注册了就可以在应用中起作用。下面小胖哥就来介绍它们。

4. 转换器

e121cb8ab3c64980a86daf2f01bfbd7a.png

Converter是一个函数接口。作用是将泛型S 转换为T,也就是类型转换器,可以实现String 到 Integer,String到LocalDate等不同类型之间的转换。特别指出的是,一定要确保S类型不能为null,而且保证该实现一定是线程安全的。如果你有集中转换的需要可以实现工厂转换器接口ConverterFactory

fd996aafdd0c5cd1c9046e1a490a9c89.png

GenericConverter是两种或更多种类型之间转换的通用转换器接口,最为灵活的转换接口,通过上面的片段可以知道,通过构建多个源数据到转换目标的唯一映射对ConvertiblePair可以实现一对多、多对多的转换关系 。

5. 格式化器

83edf64a5beabd05c45e6cb002d23dcf.png

Formatter接口用于实现字段格式化逻辑而且是强类型化的,该接口是组合接口。Printer是将对象输出为展示时的字符串,而Parser 则相反将字符串格式化为目标对象,甚至可以结合本地化。比如像上面将yyyy-MM-dd 的字符串格式化为 LocalDate。

6. 总结

我们学习了如何接受Spring MVC请求中的日期参数。而且我们也介绍了如何在局部和全局使用它们,通过延伸探索,我们也知道了它们的一些运行机制,如何的转换类型以及格式化,而且通过实现转换器、格式化器接口 并注入spring bean 就可以工作。可以根据我的介绍实际演练一下。

我是码农小胖哥,关注我的头条或者公众号,天天有干货。有问题可以留言或者私信,觉得写的不错可以点个赞,转发一下。

be4bcc3f76c0d101d34c22004e43d373.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值