
aws sqs 要求消息体必须是合法的 json 字符串,而 `jsonobject` 是 java 对象,不能直接序列化为有效消息体;需显式调用 `.tostring()` 转为字符串后发送,否则 `queuemessagingtemplate.convertandsend()` 会将其序列化为不可用的空对象(如 `{empty:true}`)。
在基于 Spring Cloud AWS 的消息推送场景中,QueueMessagingTemplate.convertAndSend() 方法依赖 Spring 的消息转换器(MessageConverter)对传入对象进行序列化。该转换器默认使用 Jackson 或 JDK 序列化机制——但 org.json.JSONObject 并非标准 Java Bean,也不实现 Serializable(老版本)或提供 Jackson 兼容的 getter/setter 结构,因此无法被正确反序列化为 JSON 字符串。相反,当传入一个普通 POJO(如 TaskMessage 类),Jackson 可通过反射读取字段并生成标准 JSON;而直接传入 JSONObject 实例时,Spring 可能退回到默认的 SimpleMessageConverter,最终将其序列化为类似 { "empty": true } 的无效结构。
✅ 正确做法是:始终确保传递给 convertAndSend() 的参数是 String 类型的合法 JSON 字符串。例如:
public String toJson() throws JSONException {
JSONObject json = new JSONObject();
json.put("payload", this.payload);
json.put("id", this.taskId);
return json.toString(); // ← 关键:转为字符串!
}然后调用:
queueMessagingTemplate.convertAndSend(queueUrl, task.toJson());
⚠️ 注意事项:
- 不要传 new JSONObject(...) 或 task.toJsonObject() 这类 JSONObject 实例;
- 若需更健壮的 JSON 处理,推荐统一使用 Jackson(ObjectMapper.writeValueAsString())替代 org.json,因其与 Spring 生态天然兼容;
- org.json 库的 JSONObject 在 Spring 消息转换链中无特殊支持,属于“黑盒对象”,应避免直接作为消息载荷;
- 启用 SQS 控制台或 CloudWatch 日志验证实际入队内容,确认 MessageBody 字段为纯文本 JSON(如 {"payload":"data","id":"123"}),而非 Base64 编码或嵌套对象。
总结:SQS 协议层只接受字符串,convertAndSend() 的“自动转换”不等于“智能 JSON 化”。明确类型边界——输入即输出,String 才是安全载体。










