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