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

如何在Spring AMQP中使用kotlinx serialization?

Spring AMQP与kotlinx serialization消息转换器问题解答

关于kotlinx serialization的等效实现

Spring AMQP没有内置针对kotlinx serialization库的MessageConverter实现,需要自行编写自定义消息转换器。

自定义转换器示例

你可以基于kotlinx serialization的Json工具类实现MessageConverter接口,核心逻辑是序列化时将对象转为JSON字节数组,反序列化时将字节数组转回目标类型:

import org.springframework.amqp.core.Message
import org.springframework.amqp.core.MessageProperties
import org.springframework.amqp.support.converter.MessageConverter
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json
import kotlinx.serialization.decodeFromString

class KotlinxSerializationJsonMessageConverter(private val json: Json = Json.Default) : MessageConverter {

    override fun toMessage(obj: Any, messageProperties: MessageProperties?): Message {
        val jsonStr = json.encodeToString(obj)
        val bytes = jsonStr.toByteArray(Charsets.UTF_8)
        val props = messageProperties ?: MessageProperties()
        props.contentType = MessageProperties.CONTENT_TYPE_JSON
        return Message(bytes, props)
    }

    override fun fromMessage(message: Message): Any? {
        val jsonStr = String(message.body, Charsets.UTF_8)
        val targetType = message.messageProperties.headers["__TypeId__"] as? String
            ?: throw IllegalArgumentException("Missing __TypeId__ header for deserialization")
        return json.decodeFromString(Class.forName(targetType).kotlin, jsonStr)
    }
}

将自定义转换器注册为Spring Bean即可生效:

@Configuration
class AmqpConfig {
    @Bean
    fun kotlinxSerializationMessageConverter(): MessageConverter {
        return KotlinxSerializationJsonMessageConverter()
    }
}

未提供MessageConverter Bean时的异常问题

如果没有自定义或注册MessageConverter Bean,Spring AMQP会默认使用SimpleMessageConverter。这个转换器仅支持将消息体转为String、byte[]或Serializable类型,无法自动将JSON格式的消息反序列化为自定义对象,因此在尝试接收并转换JSON消息时会抛出类型转换异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 15:43:12