6
votes

In my spring boot aws-cloud SNS http end point confirm subscription is not working. When SNS confirmation comes following error coming in my application. Error :

[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

My controller handler is :

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

My Pom contains following :

     <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>

I followed the explanation in this link

3

3 Answers

2
votes

Did you specify the custom resolver:

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

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

Also, I cannot see the controller mapping, but in tutorial there is a statement:

Currently it is not possible to define the mapping URL on the method level therefore the RequestMapping must be done at type level and must contain the full path of the endpoint.

2
votes

Putting this out for anyone who is after java config for this. Please note you have to use NotificationMessageHandlerMethodArgumentResolver which implements HandlerMethodArgumentResolver.

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();
    };

}
0
votes

My Kotlin Configuration looks like this, to configure the subscription and messaging and un-subscription method argument resolving

        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))
          }
        }