Java Spring/Spring Boot转换-如何在转换器上创建链?
请看下面的例子:Java Spring/Spring Boot转换-如何在转换器上创建链?,java,spring,spring-boot,kotlin,Java,Spring,Spring Boot,Kotlin,请看下面的例子: 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
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
}
class-Foo
分类栏
Baz类
@组成部分
FooToBarConverter类:转换器{
覆盖乐趣转换(源:Foo)=Bar()
}
@组成部分
BarToBazConverter类:转换器{
覆盖乐趣转换(源代码:Bar)=Baz()
}
@RestController(“/test”)
类TestController(val conversionService:conversionService){
@GetMapping
fun get()=“test:”+conversionService.convert(Foo(),Baz::class.java)
//必须将Foo转换为Bar,然后将Bar转换为Baz,但会引发异常
}
有没有办法在不改变方向盘的情况下实现所需的行为?您可以使用@Autowired private List allConverter代码>
这将注入所有正在实现Converter
接口的bean
现在您可以循环抛出列表和类convert
方法
allConverter.stream().forEatch(Converter::convert);
要管理转换器的顺序,需要对列表进行排序
希望这有助于如您所述,将Foo转换为Bar,然后将Bar转换为Baz。做到这一点,不要试图一次就做到,因为那样不行。@M.Deinum不是最好的选择。它向调用者暴露了太多的细节,使调用者知道Bar
(在编译时它甚至可能不在类路径上)以及它从Foo
转换到Baz
的可能性。我想隐藏这些细节。然后创建一个转换来实现这一点。Spring不会检测到您想要在从x到z的转换过程中执行3个步骤。您需要一个显式转换器。您可以自动连接ConversionService实例并调用它以继续转换,而不是遍历所有转换器。这可能会更有效,因为ConversionService缓存转换器以实现高效查找。如果ConversionService实例已经包含此转换器,请注意无限递归?