Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring/Spring Boot转换-如何在转换器上创建链?_Java_Spring_Spring Boot_Kotlin - Fatal编程技术网

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实例已经包含此转换器,请注意无限递归?