2017-02-14 44 views
1

我試圖通過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預先創建我的模型類。我似乎不明白我做錯了什麼。請幫忙。

+1

一些代碼段中的錯誤消息明確指出你缺少了'com.amazonaws.client.builder.AwsSyncClientBuilder'類。您是在本地進行測試還是在AWS上運行? –

+0

我在AWS上運行它。至於我試過的類,包括aws-java-sdk-core-1.11.87.jar文件,並將其添加到構建路徑中,但仍會拋出一個與JSON庫有關的新錯誤。據我瞭解,這些庫已經包含在AWS SDK中,所以我似乎無法理解這個問題。 –

回答

1

您是否使用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; 

} 
相關問題