2012-02-13 7 views
5

Podmiot, którego szukam, ma HashKey & a RangeKey (liczba). Gdy używam batchGetItem na nim, pojawia się następujący błąd:Błąd w API batchGetItem w java

AWS Error Code: ValidationException, AWS Error Message: One or more parameter values were invalid: Mismatching attribute types between location and schema

Schema:

Table: Daily

Hash Key: CustId (String)

Range Key: Dated (Number)

danych:

CustId : VisioNerdy

Dated : 1329071400000

Kod:

List<Key> fkeys = new ArrayList<Key>(); //tableName="Daily", keys=["VisioNerdy"], ranges=[1329071400000] 
    Map<String, KeysAndAttributes> requestItems = new HashMap<String, KeysAndAttributes>(); 
    for(int i = 0; i < keys.size(); i++) 
    { 
     String key = keys.get(i); 
     if(ranges == null) 
      fkeys.add(new Key().withHashKeyElement(new AttributeValue().withS(key))); 
     else 
      fkeys.add(new Key().withHashKeyElement(new AttributeValue().withS(key)) 
        .withRangeKeyElement(new AttributeValue().withS(ranges.get(i).toString()))); 
    } 
    requestItems.put(tableName, new KeysAndAttributes().withKeys(fkeys)); 
    BatchGetItemRequest batchGetItemRequest = new BatchGetItemRequest().withRequestItems(requestItems); 
    BatchGetItemResult result = client.batchGetItem(batchGetItemRequest); 

Wszelkie wskazówki?

+0

mógłbyś dodać swoją (ewentualnie skondensowany) schemat i fragment kodu wykonujący zapytanie do złagodzenia analiza? Dzięki! –

+1

Zmieniono pytanie, aby je uwzględnić. Dzięki! –

+0

Masz "if (ranges == null)", ale jeśli tabela ma klawisz zakresu, wymagana jest wartość; nie można tego pominąć. –

Odpowiedz

8

Zdefiniowano atrybut zasięgiem Hash and Range Type Primary Key jako typ Ilość jeszcze przygotować swoją wartość atrybutu poprzez withS() jako typ String na żądanie:

fkeys.add(new Key().withHashKeyElement(new AttributeValue().withS(key)) 
     .withRangeKeyElement(new AttributeValue().withS(ranges.get(i).toString()))); 

Zmiana withS(String s) do withN(String s) powinno rozwiązać problem odpowiednio (mylnie obie metody wymagają parametru typu String):

fkeys.add(new Key().withHashKeyElement(new AttributeValue().withS(key)) 
     .withRangeKeyElement(new AttributeValue().withN(ranges.get(i).toString()))); 

Wprawdzie ukryte słaby typowanie składania DynamoDB data types podstawie String parametry tylko nie dokładnie ułatwienia rozwijających się;)

+0

Gotowy! Dzięki! –

+0

@Mani: Cieszę się, że mogłem pomóc - czy mógłbyś upomnieć się, a zwłaszcza zaakceptować odpowiedź, gdyby rozwiązał twój problem? Jest to pożądane tutaj, zarówno w celu rozwiązania problemu z dala od wzroku, jak i umożliwienia użytkownikom otwartych problemów z innymi, a także zapewnienia użytkownikom motywacji do wzajemnej pomocy;) Zobacz FAQ [What is reputation?] (Http: // stackoverflow .com/faq # reputation) po szczegóły - dziękuję! –

+1

Gotowe! Dzięki za prowadzenie! –