无法通过使用java eclipse的lambda函数将项插入到dynamodb中
问题描述:
我试图通过lambda函数将项插入到dynamodb中。 我已经给出了创建iam角色和lambda函数所需的所有必需凭证。 但我的程序引发以下异常无法通过使用java eclipse的lambda函数将项插入到dynamodb中
{
"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预先创建我的模型类。我似乎不明白我做错了什么。请帮忙。
答
您是否使用AWS SDK Eclipse Plugin上传代码?或者你自己? (导出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插件选项直接编写代码。
我试过这样做,我的功能现在运行成功。
从我的审判代码
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;
}
一些代码段中的错误消息明确指出你缺少了'com.amazonaws.client.builder.AwsSyncClientBuilder'类。您是在本地进行测试还是在AWS上运行? –
我在AWS上运行它。至于我试过的类,包括aws-java-sdk-core-1.11.87.jar文件,并将其添加到构建路径中,但仍会抛出一个与JSON库有关的新错误。据我了解,这些库已经包含在AWS SDK中,所以我似乎无法理解这个问题。 –