4

DynamoDB テーブルでスキャンを実行しています。次に、返されたアイテムからそれぞれの属性をタイプのリストに追加する必要がありますUser(User単一のコンストラクターがありUser(String uuid)ます)。Listコードは現在、DB を正常にスキャンし、スキャン結果を返します。ただし、何らかの理由で反復処理が null を返すようです。

    AmazonDynamoDBClient client = dynamoClient.getDynamoClient();
    DynamoDBMapper mapper = new DynamoDBMapper(client);

    try {
        DynamoDBScanExpression scanExpression = new DynamoDBScanExpression();

        Map<String, Condition> scanFilter = new HashMap<String, Condition>();
        Condition scanCondition = 
            new Condition().withComparisonOperator(ComparisonOperator.NOT_NULL);
        scanFilter.put("uuid", scanCondition);
        scanExpression.setScanFilter(scanFilter);

        List scanResults = mapper.scan(UserAccounts.class, scanExpression);

        for (Iterator it = scanResults.iterator(); it.hasNext();) {
            //User user = (User) it.next();
            allUserSummary.add(new User(scanResults.get(1).toString()));
        }
    } catch (Exception e) {
        // TODO
    }
4

1 に答える 1

3

For-Each ループを使用して、最新のコンパクトなリスト反復を使用することをお勧めします。これは、古い反復スタイルを使用する際の多くの一般的なエラーを回避するのに役立ちます。

[...]

イテレータは雑然としています。さらに、それはエラーの機会でもあります。iterator 変数は各ループで 3 回発生します。つまり、2 回間違える可能性があります。for-each コンストラクトは、混乱とエラーの可能性を取り除きます。for-each コンストラクトを使用した場合の例を次に示します。

void cancelAll(Collection<TimerTask> c) {
    for (TimerTask t : c)
        t.cancel();
}

これをユースケースに適用すると、おおよそ次のようになります。

    List<UserAccounts> scanResults = mapper.scan(UserAccounts.class, scanExpression);

    for (UserAccounts userAccounts : scanResults) {
        allUserSummary.add(new User(userAccounts.toString()));
    }

toString()これがまだ機能しない場合は、コードがof クラスがuuidUserAccountsを返すことを想定している限り、実際のエラーを示唆する可能性があります。クラス DynamoDBMapperの例に示すように、通常のアプローチはorメソッドとそれぞれのアノテーションorを持つことです。getKey()getUuidAttribute()@DynamoDBHashKey@DynamoDBAttribute

@DynamoDBTable(tableName = "UserAccounts")
 public class UserAccounts{     
     private String key; // or uuid right away

     @DynamoDBHashKey
     public String getKey() {
         return key;
     }

     public void setKey(String key) {
         this.key = key;
     }

     // ...
 }

これにより、あなたの例では明らかに次の結果が得られます。

    List<UserAccounts> scanResults = mapper.scan(UserAccounts.class, scanExpression);

    for (UserAccounts userAccounts : scanResults) {
        allUserSummary.add(new User(userAccounts.getKey()));
    }
于 2012-05-13T14:23:30.187 に答える