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



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

我知道唯一的选择 - 创建一个包含所需类型作为字段的上层合成类,并将其作为源传递给 Spring Converter。但也许可以做得更容易?

提前谢谢。

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

根据定义,Converter接口的签名仅接受一个S,然后可以将其转换为T。如果 Spring 将来提供一个接受多个输入对象(例如SU(的接口,然后用于创建T,那就太好了,但从 Spring 5.x 开始,这仍然不存在。

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

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

  • 创建一个转换器,该转换器将接受携带对象作为其源。
    只需
    使用 SpringPair对象(假设您使用 Spring 数据(,即可轻松地使用此模式将两个对象转换为一个
    对象。有关Pair的文档可在此处找到。

以上两种方法都应该可以正常工作,假设您确实需要使用特定于 Spring 的转换器(如果您将它们全局注册到FormatterRegistry就是这种情况。

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

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

总而言之,没有一个春天不提供开箱即用的方法。本来会很好,但似乎不可用。

最新更新