2014-10-11 4 views
12

Mi sto solo alzando e correndo con DynamoDB utilizzando Java SDK (v1.8). Ho creato una tabella molto semplice utilizzando la console AWS. La mia tabella ha una chiave hash primaria, che è una stringa (senza intervallo). Ho messo un singolo oggetto nella tabella con altri 4 valori di attributo (tutte le stringhe).Richiesta DynamoDB semplice non riuscita con ResourceNotFoundException

Sto facendo una semplice richiesta Java per quell'elemento nella tabella, ma non riesce con ResourceNotFoundException. Sono assolutamente sicuro che il nome della tabella che sto fornendo sia corretto, così come il nome della chiave di hash primaria che sto usando per interrogare l'oggetto. Lo stato della tabella è elencato nella console AWS come Active e posso vedere anche l'oggetto e i suoi valori.

Questo è l'errore che sto ricevendo:

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

Ho provato quanto segue (utilizzando le dynamodbv2 versioni delle classi):

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

Ho anche provato ad utilizzare il versioni obsolete e deprecate di tutte queste classi, come questa:

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

... ma è lo stesso risultato.
La mia comprensione di ResourceNotFoundException è che significa che il nome della tabella o l'attributo referenziato non è valido, il che non è il caso. Può anche essere lanciato se la tabella è troppo presto nello stato Creating, ma la mia tabella è Active.

risposta

30

La richiesta non riusciva perché non stavo impostando la regione per il client prima di effettuare la richiesta. La regione predefinita è probabilmente quella degli Stati Uniti Est e la mia tabella è impostata nell'Europa occidentale. Questo è stato risolto:

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

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

Grazie risparmiatore di vita ... – Naruto

+0

funziona per me –

+1

Grazie anche per menzionare i pacchetti particolari –

0

il codice completo può assomiglia:

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

Se si utilizza Primavera di avvio, allora si può fare in questo modo:

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