2014-10-11 22 views
12

Tôi chỉ đang bắt đầu và chạy với DynamoDB bằng cách sử dụng SDK Java (v1.8). Tôi đã tạo ra một bảng rất đơn giản bằng cách sử dụng giao diện điều khiển AWS. Bảng của tôi có khóa băm chính, là một chuỗi (không có dải ô). Tôi đã đặt một mục vào bảng với 4 giá trị thuộc tính khác (tất cả các chuỗi).Yêu cầu DynamoDB đơn giản không thành công với ResourceNotFoundException

Tôi đang thực hiện yêu cầu Java đơn giản cho mục đó trong bảng nhưng không thành công với ResourceNotFoundException. Tôi hoàn toàn tích cực rằng tên bảng mà tôi cung cấp là chính xác, cũng như tên của khóa băm chính mà tôi đang sử dụng để truy vấn mục đó. Trạng thái bảng được liệt kê trong bảng điều khiển AWS là Active và tôi cũng có thể thấy mục và giá trị của nó.

Đây là lỗi tôi nhận được:

Requested resource not found (Service: AmazonDynamoDB; Status Code: 400; Error Code: ResourceNotFoundException; Request ID: ...) 

Tôi đã thử như sau (bằng cách sử dụng dynamodbv2 phiên bản của lớp):

Map<String, AttributeValue> key = new HashMap<String, AttributeValue>(); 
key.put(PRIMARY_KEY, new AttributeValue().withS(value)); 

GetItemRequest request = new GetItemRequest() 
    .withTableName(TABLE_NAME) 
    .withKey(key); 

GetItemResult result = client.getItem(request); 

Tôi cũng đã cố gắng sử dụng các phiên bản cũ hơn, không dùng nữa của tất cả các lớp này, như sau:

GetItemRequest request = new GetItemRequest() 
     .withTableName(TABLE_NAME) 
     .withKey(new Key().withHashKeyElement(new AttributeValue().withS(value))); 
GetItemResult result = client.getItem(request); 

... nhưng nó cũng là kết quả tương tự.
Sự hiểu biết của tôi về ResourceNotFoundException là điều đó có nghĩa là tên bảng hoặc thuộc tính được tham chiếu không hợp lệ, không phải như vậy. Nó cũng có thể được ném nếu bảng quá sớm trong trạng thái Creating, nhưng bảng của tôi là Active.

Trả lời

30

Yêu cầu không thành công vì tôi không đặt khu vực cho khách hàng trước khi đưa ra yêu cầu. Vùng mặc định có thể là US East và bảng của tôi được thiết lập ở Tây EU. Này cố định nó:

import com.amazonaws.regions.Region; 
import com.amazonaws.regions.Regions; 

client.setRegion(Region.getRegion(Regions.EU_WEST_1)); 
+0

Cảm ơn cuộc sống tiết kiệm ... – Naruto

+0

nó hoạt động cho tôi –

+1

Cảm ơn bạn cũng đã đề cập đến các gói cụ thể –

0

đầy đủ mã có thể trông giống như:

import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.Map; 

import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient; 
import com.amazonaws.services.dynamodbv2.model.AttributeValue; 
import com.amazonaws.services.dynamodbv2.model.ComparisonOperator; 
import com.amazonaws.services.dynamodbv2.model.Condition; 
import com.amazonaws.services.dynamodbv2.model.QueryRequest; 
import com.amazonaws.services.dynamodbv2.model.QueryResult; 

import com.amazonaws.regions.Region; 
import com.amazonaws.regions.Regions; 

public final class LogFetcher { 

    static AmazonDynamoDBClient client = new AmazonDynamoDBClient(); 
    static String tableName = "<TABLE_NAME>"; 

    public static ArrayList<Object> findLogsForDeviceWithMacID(String macID) { 

     client.setRegion(Region.getRegion(Regions.EU_WEST_1)); 

     Condition hashKeyCondition = new Condition() 
       .withComparisonOperator(ComparisonOperator.EQ) 
       .withAttributeValueList(new AttributeValue().withS(macID)); 
     Map<String, Condition> keyConditions = new HashMap<String, Condition>(); 
     keyConditions.put("parentKey", hashKeyCondition); 

     QueryRequest queryRequest = new QueryRequest() 
       .withTableName(tableName) 
       .withKeyConditions(keyConditions); 
     QueryResult result = client.query(queryRequest); 

     ArrayList<Object> data = new ArrayList<Object>(); 

     for (Map<String, AttributeValue> item : result.getItems()) { 
      // printItem(item); 
      data.add(item); 
     } 
     return data; 
    } 

    private static void printItem(Map<String, AttributeValue> attributeList) { 
     for (Map.Entry<String, AttributeValue> item : attributeList.entrySet()) { 
      String attributeName = item.getKey(); 
      AttributeValue value = item.getValue(); 
      System.out.println(attributeName + " " 
        + (value.getS() == null ? "" : "S=[" + value.getS() + "]") 
        + (value.getN() == null ? "" : "N=[" + value.getN() + "]") 
        + (value.getB() == null ? "" : "B=[" + value.getB() + "]") 
        + (value.getSS() == null ? "" : "SS=[" + value.getSS() + "]") 
        + (value.getNS() == null ? "" : "NS=[" + value.getNS() + "]") 
        + (value.getBS() == null ? "" : "BS=[" + value.getBS() + "] \n")); 
     } 
    } 
} 
0

Nếu bạn sử dụng Spring Boot, sau đó bạn có thể làm như thế này:

@Configuration 
@EnableDynamoDBRepositories(basePackages = "com.test.repository") 
@EntityScan("com.test.entity") 
public class DynamoDBConfig { 

    @Value("${amazon.dynamodb.endpoint}") 
    private String amazonDynamoDBEndpoint; 

    @Value("${amazon.aws.accesskey}") 
    private String amazonAWSAccessKey; 

    @Value("${amazon.aws.secretkey}") 
    private String amazonAWSSecretKey; 

@Bean 
public AmazonDynamoDB amazonDynamoDB() { 
    AwsClientBuilder.EndpointConfiguration endpointConfiguration = new AwsClientBuilder.EndpointConfiguration(
     amazonDynamoDBEndpoint, Regions.AP_SOUTHEAST_2.getName()); 

    AWSStaticCredentialsProvider credentialsProvider = new AWSStaticCredentialsProvider(amazonAWSCredentials()); 

    AmazonDynamoDB amazonDynamoDB = AmazonDynamoDBClientBuilder.standard().withEndpointConfiguration(
     endpointConfiguration).withCredentials(credentialsProvider).build(); 

    return amazonDynamoDB; 
} 

@Bean 
public AWSCredentials amazonAWSCredentials() { 
    return new BasicAWSCredentials(amazonAWSAccessKey, amazonAWSSecretKey); 
}} 
Các vấn đề liên quan