WebClient是 Spring Framework的反应式客户端,用于进行服务到服务的调用。WebClient已成为我的首选实用工具。但是,最近我在处理Java 8时间字段的方式上出乎我的意料,这使我感到震惊。这篇文章将深入探讨Java中日期和时间字段的细节。
快乐之路
首先,幸福的道路。当使用a时WebClient,Spring Boot建议 a WebClient.Builder 被注入类而不是WebClient自身,并且a WebClient.Builder已经被自动配置并且可以注入。
考虑一个虚拟的“城市”域和一个创建“城市”的客户。“城市”的结构很简单-请注意,它creationDate是Java 8“即时”类型:
用于创建此类型实例的客户端如下所示:
了解如何以一种流畅的方式表达意图。首先设置URI和标头。然后将请求主体放置到位,并将响应解组为“城市”响应类型。
一切都很好。现在,测试是什么样的?
我正在使用出色的Wiremock来启动虚拟远程服务,并使用它 CitiesClient来发送请求,方法如下:
在突出显示的行中,我要确保远程服务以ISO-8601格式接收日期为“ 1985-02-01T10:10:10Z”。在这种情况下,一切正常进行,测试通过了。
不太幸福的道路
现在考虑我WebClient.Builder以某种形式自定义的情况。这是一个例子。假设我正在使用注册表服务,并且想通过此注册表查找远程服务,然后拨打电话。然后,WebClient必须对其进行自定义以在其@LoadBalanced 上添加注释。可以在这里找到更多详细信息。
所以说我这样定制 WebClient.Builder:
看起来很简单。但是,现在,以前的测试失败了。具体来说,creationDate在线录音的日期格式 不再是ISO-8601。原始请求如下所示:
这是工作请求的外观:
看看日期格式有何不同?
问题
这个问题的根本原因很简单:WebClient.Builder当我自己显式创建bean时,Spring Boot会添加很多配置,这些配置 会丢失。具体而言,在这种情况ObjectMapper下,在封面下创建了一个Jackson ,默认情况下,它会将日期写为时间戳。可以在这里找到更多详细信息。
解
好的,那么我们如何检索在Spring Boot中进行的自定义?我实质上已经在Spring中复制了自动配置的行为,称为WebClientAutoConfiguration,它看起来像这样:
除了复制这种行为,可能还有更好的方法,但是这种方法对我有用。
现在发布的内容如下所示:
...日期以正确的格式显示。
结论
Spring Boot的自动配置 WebClient提供了一套合理的默认值。如果出于某种原因WebClient需要明确配置the 及其构建器,请警惕Spring Boot添加的一些自定义项并将其复制为自定义bean。在我的案例中,我的定制中缺少针对Java 8日期的Jackson定制WebClient.Builder,因此必须对其进行明确说明。
谢谢阅读!
有什么问题可以加下qq:2062583349。也可添加vx:admindesire,有java、python、web等习资料和视频课程干货”。欢迎交流