【问题标题】:Simple DynamoDB request failing with ResourceNotFoundException简单的 DynamoDB 请求失败并出现 ResourceNotFoundException
【发布时间】:2014-10-11 11:57:19
【问题描述】:

我刚刚开始使用 Java SDK (v1.8) 运行 DynamoDB。我使用 AWS 控制台创建了一个非常简单的表。我的表有一个主哈希键,它是一个字符串(无范围)。我已经将一个项目与其他 4 个属性值(所有字符串)一起放入表中。

我正在为表中的那个项目发出一个简单的 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

【问题讨论】:

    标签: java amazon-web-services amazon-dynamodb aws-sdk


    【解决方案1】:

    请求失败,因为我在发出请求之前没有为客户端设置区域。默认区域可能是美国东部,我的表设置在欧洲西部。这修复了它:

    import com.amazonaws.regions.Region;
    import com.amazonaws.regions.Regions;
    
    client.setRegion(Region.getRegion(Regions.EU_WEST_1));
    

    【讨论】:

    • 感谢您也提及特定的软件包
    【解决方案2】:

    完整的代码可能如下所示:

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

    【讨论】:

      【解决方案3】:

      如果你使用 Spring Boot,那么你可以这样做:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-10-17
        • 1970-01-01
        • 2021-11-27
        • 2019-02-22
        • 2021-03-10
        • 1970-01-01
        • 2016-03-02
        • 2020-12-28
        相关资源
        最近更新 更多