【问题标题】:Cannot insert items into dynamodb through a lambda function using java eclipse无法使用 java eclipse 通过 lambda 函数将项目插入 dynamodb
【发布时间】:2017-02-14 14:01:48
【问题描述】:

我正在尝试通过 lambda 函数将项目插入 dynamodb。 我已经提供了创建 iam 角色和 lambda 函数所需的所有凭据。 但是我的程序抛出了以下异常

{
  "errorMessage": "com/amazonaws/client/builder/AwsSyncClientBuilder",
  "errorType": "java.lang.NoClassDefFoundError",
  "stackTrace": [
    "java.lang.ClassLoader.defineClass1(Native Method)",
    "java.lang.ClassLoader.defineClass(ClassLoader.java:763)",
    "java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)",
    "java.net.URLClassLoader.defineClass(URLClassLoader.java:467)",
    "java.net.URLClassLoader.access$100(URLClassLoader.java:73)",
    "java.net.URLClassLoader$1.run(URLClassLoader.java:368)",
    "java.net.URLClassLoader$1.run(URLClassLoader.java:362)",
    "java.security.AccessController.doPrivileged(Native Method)",
    "java.net.URLClassLoader.findClass(URLClassLoader.java:361)",
    "java.lang.ClassLoader.loadClass(ClassLoader.java:424)",
    "java.lang.ClassLoader.loadClass(ClassLoader.java:357)",
    "com.bridgelabz.LambdaFunctionHandler.handleRequest(LambdaFunctionHandler.java:20)",
    "com.bridgelabz.LambdaFunctionHandler.handleRequest(LambdaFunctionHandler.java:1)"
  ],
  "cause": {
    "errorMessage": "com.amazonaws.client.builder.AwsSyncClientBuilder",
    "errorType": "java.lang.ClassNotFoundException",
    "stackTrace": [
      "java.net.URLClassLoader.findClass(URLClassLoader.java:381)",
      "java.lang.ClassLoader.loadClass(ClassLoader.java:424)",
      "java.lang.ClassLoader.loadClass(ClassLoader.java:357)",
      "java.lang.ClassLoader.defineClass1(Native Method)",
      "java.lang.ClassLoader.defineClass(ClassLoader.java:763)",
      "java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)",
      "java.net.URLClassLoader.defineClass(URLClassLoader.java:467)",
      "java.net.URLClassLoader.access$100(URLClassLoader.java:73)",
      "java.net.URLClassLoader$1.run(URLClassLoader.java:368)",
      "java.net.URLClassLoader$1.run(URLClassLoader.java:362)",
      "java.security.AccessController.doPrivileged(Native Method)",
      "java.net.URLClassLoader.findClass(URLClassLoader.java:361)",
      "java.lang.ClassLoader.loadClass(ClassLoader.java:424)",
      "java.lang.ClassLoader.loadClass(ClassLoader.java:357)",
      "com.bridgelabz.LambdaFunctionHandler.handleRequest(LambdaFunctionHandler.java:20)",
      "com.bridgelabz.LambdaFunctionHandler.handleRequest(LambdaFunctionHandler.java:1)"
    ]
  }
}

这是我的代码

package com.bridgelabz;

import com.amazonaws.regions.Regions;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;
import com.amazonaws.services.dynamodbv2.document.DynamoDB;
import com.amazonaws.services.dynamodbv2.document.Item;
import com.amazonaws.services.dynamodbv2.document.Table;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;

import com.amazonaws.services.lambda.runtime.events.DynamodbEvent;

public class LambdaFunctionHandler implements RequestHandler<DynamodbEvent, Object> {

    @Override
    public Object handleRequest(DynamodbEvent input, Context context) {
        context.getLogger().log("Input: " + input);

        AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().withRegion(Regions.US_WEST_2).build();
        DynamoDB dynamoDB = new DynamoDB(client);
        String tableName = "AddNumbers";

        Table table = dynamoDB.getTable(tableName);
        Model model = new Model();

        int uniqueId = model.getUniqueId();
        int number1 = model.getNumber1();
        int number2 = model.getNumber2();
        int result = number1 + number2;

        Item item = new Item().withPrimaryKey("uniqueId", uniqueId).withNumber("number1", number1)
                .withNumber("number2", number2).withNumber("result1", result);

        table.putItem(item);

        return true;
    }

}

还有我的模型课

package com.bridgelabz;

public class Model {

    int uniqueId;
    int number1;
    int number2;

    public int getUniqueId() {
        return uniqueId;
    }

    public void setUniqueId(int uniqueId) {
        this.uniqueId = uniqueId;
    }

    public int getNumber1() {
        return number1;
    }

    public void setNumber1(int number1) {
        this.number1 = number1;
    }

    public int getNumber2() {
        return number2;
    }

    public void setNumber2(int number2) {
        this.number2 = number2;
    }

}

表是预先在 dynamodb 中创建的。我似乎无法理解我做错了什么。请帮忙。

【问题讨论】:

  • 错误消息清楚地表明您缺少com.amazonaws.client.builder.AwsSyncClientBuilder 类。您是在本地测试还是在 AWS 上运行?
  • 我在 AWS 上运行它。至于我尝试包含 aws-java-sdk-core-1.11.87.jar 文件并将其添加到构建路径的类,但它仍然引发与 JSON 库有关的新错误。据我了解,这些库已经包含在 AWS SDK 中,所以我似乎无法理解这个问题。

标签: java eclipse amazon-web-services


【解决方案1】:

您是否正在使用 AWS 开发工具包 Eclipse 插件上传代码?还是靠自己? (导出 JAR,并使用 aws cli 上传)。

我编写了一个 Java Lambda 函数来接受一行,并将其输入到 DynamoDB;使用 Eclipse Export 将代码导出到 JAR,然后使用 aws cli 将其上传到 AWS 并得到 NoClassDefError。

Error loading class <xyz>.MFZLambdaStoreEvents: com/amazonaws/AmazonServiceException: class java.lang.NoClassDefFoundError
java.lang.NoClassDefFoundError: com/amazonaws/AmazonServiceException
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:348)

如果我只有一个没有 AWS SDK 依赖项的简单函数,我不会收到上述错误......

然后我遇到了http://docs.aws.amazon.com/toolkit-for-eclipse/v1/user-guide//lambda-tutorial.html 并且了解到我可以使用 Eclipse - AWS SDK Plugin 选项直接上传代码。

我试过这样做,现在我的函数运行成功了。

我的试用代码中的一些代码 sn-ps

import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient;
import com.amazonaws.services.dynamodbv2.model.AttributeValue;
import com.amazonaws.services.dynamodbv2.model.PutItemRequest;
import com.amazonaws.services.dynamodbv2.model.PutItemResult;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;

public class LambdaStoreEvents implements RequestHandler<StepsEvent, Response> {

    static AmazonDynamoDB dynamoDB;

    @Override
    public Response handleRequest(StepsEvent event, Context context) {    

    String tableName = "<tablename>";
    Map<String, AttributeValue> item = newItem(event);
    PutItemRequest putItemRequest = new PutItemRequest(tableName, item);

    dynamoDB = AmazonDynamoDBClient.builder().build();
    PutItemResult putItemResult = dynamoDB.putItem(putItemRequest);

    Response response = new Response(putItemResult.toString());

    return response;

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-13
    • 1970-01-01
    • 2019-04-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多