rabbitmq 无法将Spring Boot AMQP类java.util.LinkedHashMap强制转换为类com.example.model.X

6za6bjd0  于 2022-11-08  发布在  RabbitMQ
关注(0)|答案(1)|浏览(397)

我在KotlinSpring Boot上有2个具有请求/响应模式的服务。
在producer中,我尝试对send方法使用泛型,以避免编写具有不同返回类型的多个方法:

fun <T> sendMessage(data: String) : T {
    val listenableFuture = asyncRabbitTemplate.convertSendAndReceiveAsType(
        directExchange.name,
        "routing-key",
        data,
        object : ParameterizedTypeReference<T>() {}
    )
    return listenableFuture.get()
}

例如,我将此方法用于其中一个Model类:

制作人:

fun getData(): ExampleDto {
    ...
    return rabbitTemplate.sendMessage<ExampleDto>("data")
}

消费者:

...
@RabbitListener(...)
fun consumer(data: String): ExampleDto {
    ...
    // processing with data
    return ExampleDto(...)
}

所以我得到异常class java.util.LinkedHashMap cannot be cast to class com.example.model.ExampleDto (java.util.LinkedHashMap is in module java.base of loader 'bootstrap'; com.example.model.ExampleDto is in unnamed module of loader 'app')
如果我写的方法不带泛型,直接声明返回类型,那么一切都很好,但是我不想写很多只在返回类型上不同的方法。

9rbhqvlz

9rbhqvlz1#

ParameterizedTypeReference似乎是用来实作Super Type Token模式。当您将T当做参数型别传递时,convertSendAndReceiveAsType中的基础逻辑会因为泛型type erasure而无法推断出确切的型别。
你要么需要用ParameterizedTypeReference参数化你的sendMessage方法,然后用getData()中的具体类型创建它,要么你可以使用物化类型参数Kotlin特性来克服这个问题。

inline fun <reified T> sendMessage(data: String) : T {
    val listenableFuture = asyncRabbitTemplate.convertSendAndReceiveAsType(
        directExchange.name,
        "routing-key",
        data,
        object : ParameterizedTypeReference<T>() {}
    )
    return listenableFuture.get()
}

相关问题