4

我使用spring-cloud-awsSqsListener从AWS的简单队列服务(SQS)接收JSON Format中的AWS SNS HTTP通知。在SNS和SQS中使用SqsListener

这是对于听者的代码:

@SqsListener(value = "my-queue", deletionPolicy = SqsMessageDeletionPolicy.ON_SUCCESS) 
public void handle(final MyObject obj) throws Exception { 
// ... 
} 

上面链接的文档仅是有关发送和阅读纯序列化对象的队列和我认为接收SNS消息的预期工作开箱。但我最终接收转换错误:

10:45:51.480 [SimpleMessageListenerContainer一样-2] ERROR o.s.c.a.m.l.SimpleMessageListenerContainer - 异常遇到 处理邮件时。 org.springframework.messaging.MessagingException:调用处理程序方法时发生异常 ;嵌套的例外是 org.springframework.messaging.converter.MessageConversionException:发现转换为类com.myproject.model.MyObject没有 转换器, 消息= GenericMessage

我也尝试创建一个包装对象,看起来像上面链接了预期的SNS Json格式,但我一直得到相同的异常。唯一可用的类型是签名中的字符串。不应该自动转换SNS吗?

回答

4

是的,它应该。它确实。

为了有调用正确的HandlerMethodArgumentResolver(在这种情况下NotificationMessageArgumentResolver)在反序列化,这反过来又调用正确的转换器NotificationRequestConverter你只需要批注org.springframework.cloud.aws.messaging.config.annotation.NotificationMessage添加到您的方法签名。例如。

@SqsListener(value = "my-queue", deletionPolicy = SqsMessageDeletionPolicy.ON_SUCCESS) 
public void handle(final @NotificationMessage MyObject obj) throws Exception { 
// ... 
} 

这样你的SNS的Message部分被提取并转化为MyObject

+0

如何从SQS接收对象作为字符串? SQS是否仅支持字符串作为消息是不是真的? – jtcotton63

+0

@ jtcotton63这是真的。有效载荷以'String' - 一个JSON对象 - “@ NotificationMessage”调用一个转换器,将负载转换为所需类的对象。 – msparer