You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot AMQP泛型方法引发LinkedHashMap转ExampleDto类型转换异常

问题原因

你的泛型发送方法抛出类型转换异常,核心原因是Java/Kotlin的泛型类型擦除机制:运行时JVM无法获取T的实际类型信息,ParameterizedTypeReference<T>在运行时会被当作ParameterizedTypeReference<Object>处理。Spring的消息转换器只能将返回的JSON数据反序列化为默认的LinkedHashMap,后续强转成ExampleDto自然会失败。

解决方案

推荐使用Kotlin的inline函数+reified泛型来保留泛型类型信息,这是最简洁的解决方式,无需编写重复方法:

修改泛型发送方法

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

调用方式不变

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

原理说明

inline关键字会让函数在编译时被内联到调用处,reified关键字则允许在运行时直接获取泛型参数T的实际类型。这样ParameterizedTypeReference<T>就能正确识别目标类型,消息转换器可以直接将JSON反序列化为ExampleDto实例,避免了类型转换异常。

备选方案(若无法使用inline)

如果你的发送方法无法定义为inline函数(比如属于接口方法),可以让调用方传入ParameterizedTypeReference参数:

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

调用时:

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

内容的提问来源于stack exchange,提问作者krown_loki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 10:33:17