SNS @NotificationMessage无法处理非String类型对象的技术问询
我之前对接AWS SNS的时候也踩过这个坑,刚好能帮到你!你遇到的问题核心是AWS SNS真实环境的消息格式和LocalStack不一致,导致Spring默认的转换器无法正确解析JSON到你的SimplePojo。
为什么LocalStack正常,AWS真实环境不行?
LocalStack为了简化模拟,会直接把你的JSON作为请求payload发送;但AWS官方SNS的HTTP推送请求是application/x-www-form-urlencoded格式,实际的业务消息是包裹在Message这个表单参数里的,而不是直接的JSON payload。Spring默认的@NotificationMessage解析逻辑在这种场景下找不到正确的消息内容,就会抛出反序列化异常。
解决方案步骤
1. 确保你的SimplePojo符合Jackson反序列化要求
Jackson需要类有无参构造函数,以及对应的getter/setter(或者用Lombok的@Data注解自动生成),否则无法完成反序列化:
import lombok.Data; // 用Lombok简化,或者手动编写无参构造+getter/setter @Data public class SimplePojo { private String name; }
2. 配置自定义的NotificationMessageConverter
Spring AWS提供了MappingJackson2NotificationMessageConverter,可以帮你从SNS的表单请求中提取Message字段,并自动反序列化为你的POJO。只需在配置类中添加这个Bean:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.cloud.aws.messaging.config.annotation.NotificationMessageConverter; import org.springframework.cloud.aws.messaging.support.MappingJackson2NotificationMessageConverter; import com.fasterxml.jackson.databind.ObjectMapper; @Configuration public class AwsSnsConfig { @Bean public NotificationMessageConverter notificationMessageConverter() { MappingJackson2NotificationMessageConverter converter = new MappingJackson2NotificationMessageConverter(); // 可以传入自定义的ObjectMapper,比如配置日期格式化、枚举解析等规则 converter.setObjectMapper(new ObjectMapper()); return converter; } }
3. 确认依赖完整性
确保你的项目中已经引入了Jackson的核心依赖(Spring Boot项目通常默认包含,纯Spring项目需要手动添加):
<!-- Maven示例,Gradle可对应配置 --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.15.2</version> <!-- 使用你项目匹配的版本 --> </dependency>
验证方法
你可以用Postman模拟AWS SNS的请求格式来测试:
- 请求方法:POST
- Content-Type:
application/x-www-form-urlencoded - 表单参数:
Message:{"name":"simpleName"}Subject:Test Subject
发送请求后,如果你的handleNotificationMessage方法能正常打印Received message SimplePojo(name=simpleName),就说明配置生效了。
内容的提问来源于stack exchange,提问作者Luke

