你经常需要从一堆源对象创建一个目标对象。
我知道唯一的选择 - 创建一个包含所需类型作为字段的上层合成类,并将其作为源传递给 Spring Converter。但也许可以做得更容易?
提前谢谢。
默认情况下,Spring 似乎不提供公开任何类型的功能的接口,这些功能将允许您接受多个源对象。
根据定义,Converter
接口的签名仅接受一个S
,然后可以将其转换为T
。如果 Spring 将来提供一个接受多个输入对象(例如S
、U
(的接口,然后用于创建T
,那就太好了,但从 Spring 5.x 开始,这仍然不存在。
如果您确实想使用Converter
接口的实现,您可以执行以下任一操作:
如果你正在实例化自己,你很可能会通过一个或 对象通过构造函数。这将意味着 实现类将开始有效地存储状态(即 在我看来,这取代了简单的转换器的工作(。
创建一个转换器,该转换器将接受携带对象作为其源。
只需
使用 SpringPair
对象(假设您使用 Spring 数据(,即可轻松地使用此模式将两个对象转换为一个
对象。有关Pair
的文档可在此处找到。
以上两种方法都应该可以正常工作,假设您确实需要使用特定于 Spring 的转换器(如果您将它们全局注册到FormatterRegistry
就是这种情况。
现在,假设上述情况并非如此,没有什么可以阻止您使用本机JDK并使用BiFunction
的实现。事实上,你可以更进一步,使该类成为Component
这意味着你可以随时注入它。这样做的权衡?您将失去注册全局转换器的能力,但是,如果您的项目不使用它们,那么权衡是最小的(请注意,Converter
实现都是线程安全的(。
最后,没有什么可以阻止您创建自己的@FunctionalInterface
,您将使用它在给定任意数量的输入源的情况下执行转换。
总而言之,没有一个春天不提供开箱即用的方法。本来会很好,但似乎不可用。