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

迁移至Spring Boot 3后@SqsListener无法自动映射对象问题

Spring Boot 3迁移后@SqsListener无法自动映射JSON到自定义对象的解决方案

问题核心

迁移到Spring Boot 3及对应AWS库后,@SqsListener无法将消息自动反序列化为MyObject类型,手动转String再用ObjectMapper可以正常工作,但自定义转换器Bean未生效,报错MessageConversionException: Cannot convert from [java.lang.String] to [...]。

可行解决步骤

1. 给监听方法参数添加@Payload注解

明确告知框架该参数是消息体负载,需要进行转换:

@SqsListener("my-queue")
fun onMessage(@Payload message: MyObject) {
    // 业务逻辑
}

2. 修正自定义转换器Bean并标记为@Primary

Spring Cloud AWS 3.x中,若存在多个MessageConverter Bean,框架可能不会自动选用你的自定义实现,添加@Primary确保优先级:

@Primary
@Bean
fun sqsMessagingMessageConverter(objectMapper: ObjectMapper): SqsMessagingMessageConverter {
    val jacksonConverter = MappingJackson2MessageConverter()
    // 复用Spring容器中的ObjectMapper,避免重复配置
    jacksonConverter.objectMapper = objectMapper.apply {
        registerModule(JavaTimeModule())
        configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
        configure(SerializationFeature.WRITE_ENUMS_USING_TO_STRING, true)
        configure(DeserializationFeature.READ_ENUMS_USING_TO_STRING, true)
        configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false)
    }
    // 配置转换器处理String类型payload并转为目标对象
    jacksonConverter.setSerializedPayloadClass(String::class.java)
    
    val converter = SqsMessagingMessageConverter()
    converter.payloadMessageConverter = jacksonConverter
    // 强制使用JSON格式转换,即使消息头未指定Content-Type
    converter.setPayloadTypeHeader(MediaType.APPLICATION_JSON_VALUE)
    
    return converter
}

3. 确保消息发送端设置正确的Content-Type(可选)

如果能控制消息发送逻辑,在发送SQS消息时添加Content-Type属性为application/json,让框架明确识别消息格式:

// 示例发送代码
val messageAttributes = mapOf(
    "Content-Type" to MessageAttributeValue()
        .withDataType("String")
        .withStringValue(MediaType.APPLICATION_JSON_VALUE)
)
sqsAsyncClient.sendMessage(
    SendMessageRequest.builder()
        .queueUrl("my-queue-url")
        .messageBody(objectMapper.writeValueAsString(myObject))
        .messageAttributes(messageAttributes)
        .build()
)

4. 排查ObjectMapper Bean冲突

确保你的自定义ObjectMapper Bean全局生效,没有被其他默认ObjectMapper覆盖,必要时也给ObjectMapper添加@Primary注解。

关键注意点

  • Spring Cloud AWS 3.x包名变更为io.awspring.cloud,确认导入的SqsMessagingMessageConverter等类来自正确包路径
  • 检查消息体是否为合法JSON格式,格式错误也会触发类型转换异常

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 22:46:27