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
相关产品推荐
相关产品推荐

