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

