Spring aws-cloud SNS http端点确认订阅不起作用

Posted

技术标签:

【中文标题】Spring aws-cloud SNS http端点确认订阅不起作用【英文标题】:Spring aws-cloud SNS http end point confirm subscription not working 【发布时间】:2016-07-02 15:14:48 【问题描述】:

在我的 Spring Boot aws-cloud SNS http 端点中确认订阅不起作用。当 SNS 确认出现以下错误时,我的应用程序中出现了错误。 错误:

[Request processing failed; nested exception is java.lang.IllegalArgumentException: Invoked method public abstract void org.springframework.cloud.aws.messaging.endpoint.NotificationStatus.confirmSubscription() is no accessor method!] with root cause
    java.lang.IllegalArgumentException: Invoked method public abstract void org.springframework.cloud.aws.messaging.endpoint.NotificationStatus.confirmSubscription() is no accessor method!
        at org.springframework.util.Assert.notNull(Assert.java:115) ~[spring-core-4.2.4.RELEASE.jar!/:4.2.4.RELEASE]
        at org.spring

我的控制器处理程序是:

     @NotificationSubscriptionMapping
        public void handleSubscriptionMessage( NotificationStatus status)   throws IOException 
            //Confirming SNS subscription
            status.confirmSubscription();
        

我的 Pom 包含以下内容:

     <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-aws-messaging</artifactId>
          <version>1.0.4.RELEASE</version>
        </dependency>

        <!-- For Spring AWS autoconfiguration-->
        <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-aws-autoconfigure</artifactId>
          <version>1.0.4.RELEASE</version>
        </dependency>

我按照link中的说明进行操作

【问题讨论】:

【参考方案1】:

您是否指定了自定义解析器:

<mvc:annotation-driven>
    <mvc:argument-resolvers>
        <ref bean="notificationResolver" />
    </mvc:argument-resolvers>
</mvc:annotation-driven>

<aws-messaging:notification-argument-resolver id="notificationResolver" />

另外,我看不到控制器映射,但在教程中有一个声明:

目前无法在方法上定义映射 URL 级别,因此 RequestMapping 必须在类型级别完成,并且必须 包含端点的完整路径。

【讨论】:

谢谢@m.aibin .... 我正在使用弹簧靴进行此操作。 'spring-cloud-autoconfigure' 会处理这个吗?我在类级别定义的控制器映射。当请求到达 handleSubscriptionMessage 方法时,它工作正常。 我没有指定自定义解析器。如何以 java config 方式执行此操作?因为我正在使用弹簧靴。 robinhowlett.com/blog/2013/02/13/… 嗨。我已经设法使用xml本身添加了这个,因为java配置方式在覆盖请求解析器时存在一些问题。但是现在我在确认请求时遇到了一些错误。我应该在哪里/如何在 spring aws cloud 中配置主题 ARN?不过,我在教程中找不到任何内容。 我的问题得到了解决。解析器工作完美。另一个问题是我需要配置区域。【参考方案2】:

为任何在 java config 之后的人提供这个。请注意,您必须使用实现 HandlerMethodArgumentResolver 的 NotificationMessageHandlerMethodArgumentResolver。

import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.aws.messaging.endpoint.NotificationMessageHandlerMethodArgumentResolver;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@Configuration
@EnableWebMvc
public class MvcConfig extends WebMvcConfigurerAdapter 

    @Autowired
    private NotificationMessageHandlerMethodArgumentResolver notificationResolver;

    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) 
        argumentResolvers.add(notificationMessageHandlerMethodArgumentResolver());
    

    @Bean
    public NotificationMessageHandlerMethodArgumentResolver notificationMessageHandlerMethodArgumentResolver () 

        return new NotificationMessageHandlerMethodArgumentResolver();
    ;


【讨论】:

【参考方案3】:

我的 Kotlin 配置如下所示,用于配置订阅和消息传递以及取消订阅方法参数解析

        import com.amazonaws.services.sns.AmazonSNS
        import org.springframework.beans.factory.annotation.Autowired
        import org.springframework.cloud.aws.messaging.endpoint.config.NotificationHandlerMethodArgumentResolverConfigurationUtils
        import org.springframework.context.annotation.Configuration
        import org.springframework.web.method.support.HandlerMethodArgumentResolver
        import org.springframework.web.servlet.config.annotation.EnableWebMvc
        import org.springframework.web.servlet.config.annotation.WebMvcConfigurer
        
        @Configuration
        @EnableWebMvc
        class ListenerWebConfiguration : WebMvcConfigurer
        
          @Autowired
          private lateinit var amazonSNS: AmazonSNS
        
          override fun addArgumentResolvers(argumentResolvers: MutableList<HandlerMethodArgumentResolver>) 
argumentResolvers.add(NotificationHandlerMethodArgumentResolverConfigurationUtils.getNotificationHandlerMethodArgumentResolver(amazonSNS))
          
        

【讨论】:

以上是关于Spring aws-cloud SNS http端点确认订阅不起作用的主要内容,如果未能解决你的问题,请参考以下文章

使用 Java spring cloud aws 确认 SNS 通知时出现 InvalidParameterException

如何使用AWS Lambda和SNS事件触发Spring Cloud功能的重试

Spring Cloud AWS 是不是支持使用 Amazon S3 Buckets 大于 256 的 Amazon SNS 消息负载?

通过 HTTP 确认 SNS 订阅

如何通过 http 触发器从 AWS SNS 触发 GCP 云功能(私有)

将 SqsListener 与 SNS 和 SQS 一起使用