玩转spring mvc入参自定义类型转换和格式化

点击蓝色“程序猿DD”关注我

回复“资源”获取独家整理的学习资料!


概述

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

玩转spring mvc入参自定义类型转换和格式化_第1张图片当使用根据ISO 8601格式化的参数向任何这些方法发送POST请求时,报出了如下异常:


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


在请求级别转换日期参数

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

玩转spring mvc入参自定义类型转换和格式化_第2张图片这样,如果使用ISO 8601格式格式化字符串,则字符串将正确转换为日期对象。我们也可以使用自己的转换模式。我们可以在@DateTimeFormat中设置一个pattern参数  :

玩转spring mvc入参自定义类型转换和格式化_第3张图片


在应用程序全局转换日期参数

在Spring中处理日期和时间对象转换的另一种方法是提供全局配置。我们可以通过自动化配置类WebMvcAutoConfiguration中找到相关的处理机制:玩转spring mvc入参自定义类型转换和格式化_第4张图片重点是该类的参数:

玩转spring mvc入参自定义类型转换和格式化_第5张图片我们指定了格式就可以自动转换了。通过此约定配置我们可以指定一个统一的处理风格。从spring源码中我们得知在初始化FormattingConversionService类调用了addFormatters(FormatterRegistry registry),我们找到了该方法的具体实现:

玩转spring mvc入参自定义类型转换和格式化_第6张图片我们发现Converter、GenericConverter、Formatter  三种类型的的Spring bean 都可以被自动注入到格式化注册机中去。当然必须注册为spring bean才能在应用中起作用。下面小胖哥就来介绍它们。


转换器

玩转spring mvc入参自定义类型转换和格式化_第7张图片Converter是一个函数接口。作用是将泛型S 转换为T,也就是类型转换器,可以实现String 到 Integer,String到LocalDate等不同类型之间的转换。特别指出的是,一定要确保S类型不能为null,而且保证该实现一定是线程安全的。如果你有集中转换的需要可以实现工厂转换器接口ConverterFactory。


玩转spring mvc入参自定义类型转换和格式化_第8张图片GenericConverter是两种或更多种类型之间转换的通用转换器接口,最为灵活的转换接口,通过上面的片段可以知道,通过构建多个源数据到转换目标的唯一映射对ConvertiblePair可以实现一对多、多对多的转换关系 。


格式化器

玩转spring mvc入参自定义类型转换和格式化_第9张图片Formatter接口用于实现字段格式化逻辑而且是强类型化的,该接口是组合接口。Printer是将对象输出为展示时的字符串,而Parser 则相反将字符串格式化为目标对象,甚至可以结合本地化。比如像上面将yyyy-MM-dd 的字符串格式化为 LocalDate。


总结

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


留言交流不过瘾?添加微信:zyc_enjoy

根据指引加入各种主题讨论群

每日一问

今日问题

已知: 每个飞机只有一个油箱, 飞机之间可以相互加油(注意是相互,没有加油机) 一箱油可供一架飞机绕地球飞半圈,问题:为使至少一架飞机绕地球一圈回到起飞时的飞机场,至少需要出动几架飞机?(所有飞机从同一机场起飞,而且必须安全 返回机场,不允许中途降落,中间没有飞机场) 

(留言说说你的答案吧,明日推文公布答案)


昨日答案

在外面打开一盏灯,等20分钟关闭,再打开一盏灯,直接进去。摸一摸灯泡的温度,热的那个就是第一个打开的开关,亮着的就是现在打开的开关,最后一个就是没动的开关。

(昨日问题可在昨日推文的文末查看)


推荐阅读

  • 攻破MySQL性能瓶颈必知的调优技巧

  • 如何模拟将CPU、IO打满?

  • Spring Cloud Alibaba 发布第一个正式版本,顺利完成孵化!

  • 用命令行在控制台里玩斗地主,试过没?

  • Spring Boot 面试的十个问题


来星球聊聊技术人的斜杠生活

640?wx_fmt=png


点一点“阅读原文”小惊喜在等你

你可能感兴趣的:(玩转spring mvc入参自定义类型转换和格式化)