【问题标题】:NoSuchMethod when calling AWS Lambda using the AWS Sdk使用 AWS Sdk 调用 AWS Lambda 时的 NoSuchMethod
【发布时间】:2017-09-10 08:06:25
【问题描述】:

我在 API Gateway 中创建并部署了一个简单的 GET API,这里是 ARN,这个函数没有任何身份验证,我可以简单地在我的浏览器上调用它

arn:aws:lambda:ap-southeast-1:XXXXXXXXXXXXXX:function:La

并且可以使用浏览器浏览的公共url是:

https://xxxxxxxxx.execute-api.ap-southeast-1.amazonaws.com/v1/lambda/geta

我正在使用 Spring Boot 项目和下面的代码来调用 API(遵循 this Doc

作为 lambda 服务的接口

package com.xxxxxxx.services.interfaces;

import com.amazonaws.services.lambda.invoke.LambdaFunction;

public interface ILambdaGetBalance {

    @LambdaFunction(functionName="La")
        String getA();
    }

使用该接口调用 lambda 函数的服务

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import com.xxxxxxxx.services.interfaces.ILambdaGetBalance;
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.lambda.AWSLambda;
import com.amazonaws.services.lambda.AWSLambdaClientBuilder;
import com.amazonaws.services.lambda.invoke.LambdaInvokerFactory;

@Service
public class LambdaService {

    @Value("${aws.access-key}")
    private String accessKey; 

    @Value("${aws.secret-key}")
    private String secretKey;

    @Value("${aws.lambda.region-name}") // this is ap-southeast-1
    private String regionName;

    public void test() {
        AWSCredentials credentials = new BasicAWSCredentials(accessKey,
                secretKey); 
        AWSLambda client = AWSLambdaClientBuilder.standard()
                .withCredentials(new AWSStaticCredentialsProvider(credentials))
                .withRegion(regionName)
                .build();

        final ILambdaGetBalance getBalance = LambdaInvokerFactory.builder()
                .lambdaClient(client)
                .build(ILambdaGetBalance.class);

        getBalance.getA();
    }
}

调用getA函数后系统会出现如下异常:

java.lang.NoSuchMethodError: com.amazonaws.services.lambda.AWSLambdaClient.beforeClientExecution(Lcom/amazonaws/AmazonWebServiceRequest;)Lcom/amazonaws/AmazonWebServiceRequest;

知道为什么会这样吗?我错过了什么?

【问题讨论】:

标签: java amazon-web-services aws-lambda aws-sdk aws-java-sdk


【解决方案1】:

看起来您的 aws-java-sdk-lambdaaws-java-sdk-core 模块可能有不兼容的版本。您如何解决项目的依赖关系? beforeClientExecution 方法已添加到 1.11.106aws-java-sdk-core 版本中的 AmazonWebServiceClient 基类 - 请参见此处:https://github.com/aws/aws-sdk-java/blame/master/aws-java-sdk-core/src/main/java/com/amazonaws/AmazonWebServiceClient.java#L590

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-24
    • 2022-01-17
    • 2017-12-07
    • 2018-02-22
    • 2018-11-26
    • 1970-01-01
    • 2021-09-19
    • 2015-04-13
    相关资源
    最近更新 更多