GetItem DynamoDB in Java (AWS SDK v2)
AWS SDK for Java 2.x modella un Item come una Map<String, AttributeValue> assemblata tramite builder immutabili. Due delle sue convenzioni differiscono dalla maggior parte degli altri SDK: i numeri sono tipizzati come stringhe, e le collection di risposta non sono mai null.
La richiesta in sé ha bisogno della chiave primaria completa, come ovunque.
Codice
import java.util.HashMap;
import java.util.Map;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.dynamodb.DynamoDbClient;
import software.amazon.awssdk.services.dynamodb.model.AttributeValue;
import software.amazon.awssdk.services.dynamodb.model.DynamoDbException;
import software.amazon.awssdk.services.dynamodb.model.GetItemRequest;
public class GetItemExample {
public static void main(String[] args) {
try (DynamoDbClient ddb = DynamoDbClient.builder()
.region(Region.US_EAST_1)
.build()) {
Map<String, AttributeValue> key = new HashMap<>();
key.put("Artist", AttributeValue.builder().s("Arturo Sandoval").build());
key.put("SongTitle", AttributeValue.builder().s("Cubano Chant").build());
Map<String, String> names = new HashMap<>();
names.put("#proj0", "Artist");
names.put("#proj1", "SongTitle");
names.put("#proj2", "AlbumTitle");
names.put("#proj3", "Year");
GetItemRequest request = GetItemRequest.builder()
.tableName("Music")
.key(key)
.projectionExpression("#proj0, #proj1, #proj2, #proj3")
.expressionAttributeNames(names)
.build();
Map<String, AttributeValue> item = ddb.getItem(request).item();
if (item.isEmpty()) {
System.out.println("Item not found");
} else {
System.out.println(item);
}
} catch (DynamoDbException e) {
System.err.println(e.getMessage());
}
}
}Spiegazione
n()prende unaString—AttributeValue.builder().n(1994)non compila. Il Javadoc ne dà la ragione: "Numbers are sent across the network to DynamoDB as strings, to maximize compatibility across languages and libraries." Quindi èn("1994"), e il parsing al ritorno è affar tuo.item()non restituisce mainull— un mancato riscontro produce una mappa vuota, quindi il test èisEmpty(). Per distinguere "il servizio non ha restituito nulla" da "il servizio ha restituito una mappa vuota", chiamahasItem(); l'SDK costruisce automaticamente collection vuote ehasItem()è l'unica cosa che vede oltre quel velo.- La mappa che restituisce è immutabile — il Javadoc è esplicito sul fatto che modificarla solleva
UnsupportedOperationException. Copiala prima in unaHashMapse hai intenzione di modificarla. - Nulla valida la mappa di alias in locale —
expressionAttributeNamesè una sempliceMap<String, String>. Qui#proj3è necessario perchéYearè una parola riservata, e un alias che dichiari ma non referenzi mai è un errore a sé lato servizio: "Value provided in ExpressionAttributeNames unused in expressions". - Un solo client per l'intera applicazione — AWS lo dice chiaramente: "Service clients in the AWS SDK for Java 2.x are thread-safe." Il blocco try-with-resources va bene per un
mainusa e getta; in un servizio a lunga esecuzione, costruisci il client all'avvio e non chiuderlo mai per singola richiesta. .consistentRead(true)raddoppia il costo di lettura ed è rifiutato su un GSI. Se le mappe diAttributeValueti stanno strette, il DynamoDB Enhanced Client (software.amazon.awssdk.enhanced.dynamodb) mappa gli Item su bean annotati sopra queste stesse chiamate di basso livello.
Fallo visivamente
Che questa lettura fatturi 0,5 o 1 unità di capacità dipende dal fatto che l'Item stia entro i 4 KB. Il calcolatore della dimensione degli Item misura un Item incollato rispetto a quel confine.
DynoTable mostra gli stessi Item come normali righe, ed esporta la query dietro la griglia come un programma Java costruito con questi builder. Scarica DynoTable.
Esempi correlati
- GetItem DynamoDB in Go — la stessa lettura con AWS SDK for Go v2.
- Query DynamoDB in Java — leggi un'intera partizione invece di un solo Item.
- Come funzionano le partition key di DynamoDB — perché
GetItemha bisogno della chiave completa. - DynamoDB ResourceNotFoundException — il primo errore tipico qui: nome della tabella o regione sbagliati.
- "The provided key element does not match the schema" — la chiave che passi non corrisponde allo schema di chiave della tabella.
Riferimenti
- GetItem — Amazon DynamoDB API Reference
- Use GetItem with an AWS SDK or CLI — Amazon DynamoDB Developer Guide
- DynamoDbClient — AWS SDK for Java 2.x API Reference
- GetItemRequest — AWS SDK for Java 2.x API Reference
- Read consistency — Amazon DynamoDB Developer Guide
- Use singleton service client instances with the AWS SDK for Java 2.x
Ultima verifica 2026-07-28 rispetto alla documentazione ufficiale AWS collegata sopra.