2014-10-11 4 views
12

Java SDK (v1.8)를 사용하여 DynamoDB를 시작했습니다. 필자는 AWS 콘솔을 사용하여 매우 간단한 테이블을 만들었습니다. 내 테이블에 기본 해시 키가 있는데, 문자열 (범위 없음)입니다. 하나의 항목을 4 개의 다른 속성 값 (모든 문자열)과 함께 테이블에 넣었습니다.ResourceNotFoundException을 사용하여 간단한 DynamoDB 요청이 실패했습니다.

테이블에서 해당 항목에 대한 간단한 Java 요청을 만들고 있지만, 오류 메시지는 ResourceNotFoundException입니다. 나는 아이템을 쿼리하기 위해 사용하는 기본 해시 키의 이름과 마찬가지로 내가 제공하는 테이블 이름이 정확하다는 점에 절대적으로 긍정적입니다. 테이블 상태는 AWS 콘솔에 Active으로 표시되며 항목과 값도 볼 수 있습니다.

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

나는 다음 (클래스의 dynamodbv2 버전 사용) 시도했다 : :

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); 

나는 또한 사용하여 시도했습니다를

내가지고있어 오류입니다 이러한 모든 클래스의 더 이상 사용되지 않는 버전은 다음과 같습니다.

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

...하지만 같은 결과입니다.
ResourceNotFoundException에 대한 나의 이해는 참조 된 테이블 이름이나 속성이 유효하지 않음을 의미합니다. 테이블이 Creating 상태에서 너무 일찍 나오면 내 테이블이 Active인데도 throw 될 수 있습니다.

답변

30

요청하기 전에 클라이언트의 영역을 설정하지 않았기 때문에 요청이 실패했습니다. 기본 지역은 아마도 미국 동부이며 내 테이블은 EU 서부에 설정되어 있습니다. 이것은 고정 :

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

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

감사 생명의 은인을 ... – Naruto

+0

그것은 나를 위해 작동 –

+1

또한 특정 패키지를 언급 ​​주셔서 감사합니다 –

0

전체 코드 수도 외모처럼 :

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

당신은 다음과 같이 할 수있는, 봄 부팅을 사용하는 경우 :

@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); 
}} 
관련 문제