当您需要将多种类型作为源传递时,实现 Spring 转换器接口的最佳方式

Best way to implement Spring's Converter interface when you need to pass multiple types as source

您经常需要从一堆源对象中创建一个目标对象。

我知道唯一的选择 - 制作一个包含所需类型作为其字段的上层合成 class,并将其作为源传递给 Spring 转换器。但也许可以更轻松地做到这一点?

提前致谢。

默认情况下 Spring 似乎不提供公开任何类型的功能的接口,这些功能将允许您接受多个源对象。

根据定义,Converter 接口的签名只接受 S,然后可以将其转换为 T。如果 Spring 将来会提供一个可以接受多个输入对象(例如 SU)的接口,那将是非常好的,然后将用于创建一个T 但截至 Spring 5.x 这仍然不存在。

如果您真的想使用 Converter 接口的实现,您可以执行以下任一操作:

  • 如果你自己实例化,你可以传入一个或 对象通过构造函数。这将意味着 实现 class 将开始有效地存储状态(即 在我看来,它取代了简单转换器的工作)。

  • 创建一个接受进位对象作为源的转换器。
    这种模式可以很容易地用于将两个对象转换为一个
    只需使用 Spring Pair 对象(假设您使用 Spring
    数据)。有关 Pair 的文档可以在 here.

  • 中找到

假设您确实需要使用 Spring 特定转换器(如果您将它们全局注册到 FormatterRegistry.

现在,假设上述情况并非如此,没有什么能阻止您使用原生 JDK 并使用 BiFunction 的实现。事实上,您可以更进一步,将 class 设为 Component,这意味着您可以随时注入它。这样做的权衡?你将失去注册全局转换器的能力,但是嘿,如果你的项目不使用它们,那么权衡是最小的(这里注意 Converter 实现是线程安全的)。

最后,没有什么能阻止您创建自己的 @FunctionalInterface,您将使用它来执行给定任意数量输入源的转换。

总而言之,Spring 没有提供开箱即用的方法。这本来不错,但似乎不可用。