GetItem DynamoDB en Java (AWS SDK v2)
L'AWS SDK for Java 2.x modélise un élément comme une Map<String, AttributeValue> assemblée via des builders immuables. Deux de ses conventions diffèrent de la plupart des autres SDK : les nombres sont typés comme des chaînes, et les collections de réponse ne sont jamais nulles.
La requête elle-même a besoin de la clé primaire complète, comme partout ailleurs.
Code
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());
}
}
}Explication
n()prend unString—AttributeValue.builder().n(1994)ne compile pas. La Javadoc en donne la raison : "Numbers are sent across the network to DynamoDB as strings, to maximize compatibility across languages and libraries." C'est doncn("1994"), et le parsing au retour t'appartient.item()ne renvoie jamaisnull— une absence de correspondance donne une map vide, donc le test c'estisEmpty(). Pour distinguer « le service n'a rien renvoyé » de « le service a renvoyé une map vide », appellehasItem(); le SDK construit automatiquement des collections vides ethasItem()est la seule chose qui voit au travers.- La map qu'il te rend est immuable — la Javadoc est explicite : la modifier lève une
UnsupportedOperationException. Copie-la d'abord dans uneHashMapsi tu comptes l'éditer. - Rien ne valide la map d'alias localement —
expressionAttributeNamesest une simpleMap<String, String>.#proj3est obligatoire ici parce queYearest un mot réservé, et un alias que tu déclares sans jamais le référencer est une erreur à part entière, côté service : "Value provided in ExpressionAttributeNames unused in expressions". - Un seul client pour toute l'application — AWS le dit sans détour : "Service clients in the AWS SDK for Java 2.x are thread-safe." Le bloc try-with-resources convient à un
mainponctuel ; dans un service au long cours, construis le client au démarrage et ne le ferme jamais à chaque requête. .consistentRead(true)double le coût de lecture et est rejeté sur un GSI. Si les maps d'AttributeValuefinissent par lasser, le DynamoDB Enhanced Client (software.amazon.awssdk.enhanced.dynamodb) projette les éléments sur des beans annotés au-dessus de ces mêmes appels bas niveau.
Le faire visuellement
Savoir si cette lecture facture 0,5 ou 1 unité de capacité se joue sur le fait que l'élément tienne ou non sous 4 Ko. Le calculateur de taille d'élément mesure un élément collé par rapport à cette frontière.
DynoTable affiche les mêmes éléments comme des lignes ordinaires, et exporte la requête derrière la grille sous forme de programme Java bâti sur ces builders. Télécharge DynoTable.
Exemples liés
- GetItem DynamoDB en Go — la même lecture avec l'AWS SDK for Go v2.
- Query DynamoDB en Java — lire toute une partition plutôt qu'un seul élément.
- Comment fonctionnent les clés de partition DynamoDB — pourquoi
GetItema besoin de la clé complète. - DynamoDB ResourceNotFoundException — la première erreur habituelle ici : mauvais nom de table ou mauvaise région.
- "The provided key element does not match the schema" — la clé que tu passes ne correspond pas au schéma de clé de la table.
Références
- 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
Dernière vérification le 2026-07-28 par rapport à la documentation officielle AWS liée ci-dessus.