WebClient是  Spring Framework的反应式客户端,用于进行服务到服务的调用。WebClient已成为我的首选实用工具。但是,最近我在处理Java 8时间字段的方式上出乎我的意料,这使我感到震惊。这篇文章将深入探讨Java中日期和时间字段的细节。

快乐之路

首先,幸福的道路。当使用a时WebClientSpring Boot建议 a WebClient.Builder 被注入类而不是WebClient自身,并且a WebClient.Builder已经被自动配置并且可以注入。

考虑一个虚拟的“城市”域和一个创建“城市”的客户。“城市”的结构很简单-请注意,它creationDate是Java 8“即时”类型:

Spring WebClient和Java日期时间字段

用于创建此类型实例的客户端如下所示:

Spring WebClient和Java日期时间字段


了解如何以一种流畅的方式表达意图。首先设置URI和标头。然后将请求主体放置到位,并将响应解组为“城市”响应类型。

一切都很好。现在,测试是什么样的?

我正在使用出色的Wiremock来启动虚拟远程服务,并使用它   CitiesClient来发送请求,方法如下:

Spring WebClient和Java日期时间字段

Spring WebClient和Java日期时间字段


在突出显示的行中,我要确保远程服务以ISO-8601格式接收日期为“ 1985-02-01T10:10:10Z”。在这种情况下,一切正常进行,测试通过了。

不太幸福的道路

现在考虑我WebClient.Builder以某种形式自定义的情况。这是一个例子。假设我正在使用注册表服务,并且想通过此注册表查找远程服务,然后拨打电话。然后,WebClient必须对其进行自定义以在其@LoadBalanced 上添加注释。可以在这里找到更多详细信息。

所以说我这样定制  WebClient.Builder

Spring WebClient和Java日期时间字段


看起来很简单。但是,现在,以前的测试失败了。具体来说,creationDate在线录音的日期格式   不再是ISO-8601。原始请求如下所示:

Spring WebClient和Java日期时间字段


这是工作请求的外观:

Spring WebClient和Java日期时间字段


看看日期格式有何不同?

问题

这个问题的根本原因很简单:WebClient.Builder当我自己显式创建bean时,Spring Boot会添加很多配置,这些配置   会丢失。具体而言,在这种情况ObjectMapper下,在封面下创建了一个Jackson ,默认情况下,它会将日期写为时间戳。可以在这里找到更多详细信息。

好的,那么我们如何检索在Spring Boot中进行的自定义?我实质上已经在Spring中复制了自动配置的行为,称为WebClientAutoConfiguration,它看起来像这样:

Spring WebClient和Java日期时间字段


除了复制这种行为,可能还有更好的方法,但是这种方法对我有用。

现在发布的内容如下所示:

Spring WebClient和Java日期时间字段

...日期以正确的格式显示。

结论

Spring Boot的自动配置   WebClient提供了一套合理的默认值。如果出于某种原因WebClient需要明确配置the   及其构建器,请警惕Spring Boot添加的一些自定义项并将其复制为自定义bean。在我的案例中,我的定制中缺少针对Java 8日期的Jackson定制WebClient.Builder,因此必须对其进行明确说明。

这里提供示例测试和定制。

谢谢阅读!

有什么问题可以加下qq:2062583349。也可添加vx:admindesire,有java、python、web等习资料和视频课程干货”。欢迎交流

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-06-10
  • 2021-10-14
  • 2021-09-15
  • 2021-08-02
  • 2021-09-20
猜你喜欢
  • 2021-11-10
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-11-18
相关资源
相似解决方案