【问题标题】:Spring/Spring Boot conversion - how to make a chain on Converters?Spring/Spring Boot 转换 - 如何在转换器上创建链?
【发布时间】:2019-06-18 03:36:02
【问题描述】:

请看下面的例子:

class Foo
class Bar
class Baz

@Component
class FooToBarConverter : Converter<Foo, Bar> {
    override fun convert(source: Foo) = Bar()
}

@Component
class BarToBazConverter : Converter<Bar, Baz> {
    override fun convert(source: Bar) = Baz()
}

@RestController("/test")
class TestController(val conversionService: ConversionService) {
    @GetMapping
    fun get() = "test: " + conversionService.convert(Foo(), Baz::class.java)
    // must convert Foo to Bar, then Bar to Baz, but throws an exception instead
}

有什么方法可以在不重新发明轮子的情况下实现所需的行为?

【问题讨论】:

  • 如您所说 将 Foo 转换为 Bar,然后将 Bar 转换为 Baz 。这样做,不要试图一口气做,因为那是行不通的。
  • @M.Deinum 不是最佳选择。它向调用者暴露了太多细节,使其知道Bar(在编译时它甚至可能不存在于类路径中)以及它从FooBaz 转换的可能性。我想隐藏这些细节。
  • 然后创建一个执行此操作的转换。 Spring 不会检测到您想采取 3 个步骤从 x 转换为 z。你需要有一个明确的转换器。

标签: java spring spring-boot kotlin


【解决方案1】:

您可以使用
@Autowired private List&lt;Converter&gt; allConverter;

这将注入所有实现Converter 接口的bean。

现在您可以循环抛出列表和类convert 方法。

allConverter.stream().forEach(Converter::convert);

要管理转换器的顺序,您需要对列表进行排序。

【讨论】:

  • 您可以自动装配 ConversionService 实例并调用它以继续转换,而不是遍历所有转换器。这可能会更高效,因为 ConversionService 缓存转换器以进行有效查找。如果 ConversionService 实例已经包含此转换器,请注意无限递归?
猜你喜欢
  • 2015-04-18
  • 1970-01-01
  • 2018-04-04
  • 1970-01-01
  • 2019-12-16
  • 2017-11-11
  • 2018-10-14
  • 2019-06-18
  • 1970-01-01
相关资源
最近更新 更多