DynamoDB GetItem in Java (AWS SDK v2)
AWS SDK for Java 2.x modelliert ein Item als Map<String, AttributeValue>, zusammengesetzt über unveränderliche Builder. Zwei seiner Konventionen weichen von den meisten anderen SDKs ab: Zahlen sind als Strings typisiert, und Antwort-Collections sind nie null.
Der Request selbst braucht den vollständigen Primary Key, wie überall sonst auch.
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());
}
}
}Erklärung
n()nimmt einenString—AttributeValue.builder().n(1994)kompiliert nicht. Das Javadoc nennt den Grund: "Numbers are sent across the network to DynamoDB as strings, to maximize compatibility across languages and libraries." Alson("1994"), und das Parsen auf dem Rückweg ist deine Sache.item()gibt nienullzurück — ein Fehlschlag liefert eine leere Map,isEmpty()ist also der Test. Um „der Dienst hat nichts zurückgegeben" von „der Dienst hat eine leere Map zurückgegeben" zu trennen, rufhasItem()auf; das SDK konstruiert leere Collections automatisch, undhasItem()ist das Einzige, was da hindurchsieht.- Die zurückgegebene Map ist unveränderlich — das Javadoc sagt ausdrücklich, dass eine Änderung eine
UnsupportedOperationExceptionwirft. Kopiere sie erst in eineHashMap, wenn du sie bearbeiten willst. - Nichts validiert die Alias-Map lokal —
expressionAttributeNamesist eine schlichteMap<String, String>.#proj3ist hier nötig, weilYearein reserviertes Wort ist, und ein Alias, den du deklarierst, aber nie referenzierst, ist ein eigener serverseitiger Fehler: „Value provided in ExpressionAttributeNames unused in expressions". - Ein Client für die ganze Anwendung — AWS sagt es unmissverständlich: "Service clients in the AWS SDK for Java 2.x are thread-safe." Der try-with-resources-Block passt zu einer einmaligen
main; in einem langlaufenden Dienst baust du den Client beim Start und schließt ihn nie pro Request. .consistentRead(true)verdoppelt die Lesekosten und wird auf einem GSI abgelehnt. WennAttributeValue-Maps mühsam werden: Der DynamoDB Enhanced Client (software.amazon.awssdk.enhanced.dynamodb) bildet Items über denselben Low-Level-Aufrufen auf annotierte Beans ab.
Mach es visuell
Ob dieses Lesen 0,5 oder 1 Kapazitätseinheit kostet, hängt daran, ob das Item in 4 KB passt. Der Item-Size-Rechner misst ein eingefügtes Item gegen diese Grenze.
DynoTable zeigt dieselben Items als gewöhnliche Zeilen und exportiert die Abfrage hinter dem Grid als Java-Programm, aufgebaut aus diesen Buildern. DynoTable herunterladen.
Verwandte Beispiele
- DynamoDB GetItem in Go — dasselbe Lesen mit AWS SDK for Go v2.
- DynamoDB Query in Java — eine ganze Partition statt eines einzelnen Items lesen.
- Wie DynamoDB-Partition-Keys funktionieren — warum
GetItemden vollständigen Key braucht. - DynamoDB ResourceNotFoundException — der übliche erste Fehler hier: falscher Tabellenname oder falsche Region.
- „The provided key element does not match the schema" — der übergebene Key passt nicht zum Key-Schema der Tabelle.
Referenzen
- 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
Zuletzt verifiziert am 2026-07-28 gegen die oben verlinkte offizielle AWS-Dokumentation.