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