Spring Cloud AWS 3.x:移除SqsTemplate发送消息时MessageAttributes中的JavaType
解决Spring Cloud AWS 3.x SqsTemplate发送消息时移除JavaType属性的问题
问题分析
SqsTemplate默认使用MappingJackson2MessageConverter时,会自动添加JavaType消息属性标识消息的Java类型。这个属性会导致接收端反序列化时,优先匹配StringMessageConverter(因属性值为java.lang.String),无法正确转换为DummyRequest类型。
解决方案
1. 全局配置自定义MappingJackson2MessageConverter(推荐)
通过配置Bean关闭转换器自动添加类型信息的功能,所有通过SqsTemplate发送的消息都不会携带JavaType属性:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.messaging.converter.MappingJackson2MessageConverter; @Configuration public class SqsConfig { @Bean public MappingJackson2MessageConverter mappingJackson2MessageConverter() { MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter(); // 关闭自动添加JavaType类型信息 converter.setAddTypeInfo(false); return converter; } }
2. 发送特定消息时手动移除JavaType属性
如果仅需针对部分消息处理,可在发送前构建Message对象并手动移除该属性:
import org.springframework.messaging.Message; import org.springframework.messaging.support.MessageBuilder; import org.springframework.cloud.aws.messaging.core.SqsTemplate; // 构建消息 DummyRequest request = new DummyRequest(); Message<DummyRequest> message = MessageBuilder.withPayload(request) .build(); // 移除自动添加的JavaType属性 message.getHeaders().remove("JavaType"); // 发送消息 sqsTemplate.send("your-queue-name", message);
3. 手动控制消息属性,完全不添加JavaType
直接构建自定义消息属性集合,仅携带业务所需属性:
import software.amazon.awssdk.services.sqs.model.MessageAttributeValue; import org.springframework.cloud.aws.messaging.core.SqsTemplate; import java.util.HashMap; import java.util.Map; // 构建自定义消息属性 Map<String, MessageAttributeValue> attributes = new HashMap<>(); attributes.put("Content-type", MessageAttributeValue.builder() .dataType("String") .stringValue("application/json") .build()); // 发送消息,仅携带指定属性 sqsTemplate.send("your-queue-name", request, attributes);
验证
发送消息后检查MessageAttributes,确认不再包含JavaType属性,接收端即可通过MappingJackson2MessageConverter正常反序列化为DummyRequest类型。
内容的提问来源于stack exchange,提问作者hun
相关产品推荐
相关产品推荐

