GetItem de DynamoDB en Java (SDK de AWS v2)
El SDK de AWS para Java 2.x modela un Item como un Map<String, AttributeValue> ensamblado con builders inmutables. Dos de sus convenciones difieren de las de casi todos los demás SDK: los números se tipan como cadenas y las colecciones de la respuesta nunca son null.
La petición en sí necesita la clave principal completa, igual que en todas partes.
Código
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());
}
}
}Explicación
n()recibe unString—AttributeValue.builder().n(1994)no compila. El Javadoc da la razón: "Numbers are sent across the network to DynamoDB as strings, to maximize compatibility across languages and libraries." Así que esn("1994"), y el parseo a la vuelta es cosa tuya.item()nunca devuelvenull— un fallo da un mapa vacío, así que la prueba esisEmpty(). Para separar «el servicio no devolvió nada» de «el servicio devolvió un mapa vacío», llama ahasItem(); el SDK construye automáticamente colecciones vacías yhasItem()es lo único que ve a través de eso.- El mapa que te devuelve es inmutable — el Javadoc es explícito en que modificarlo lanza
UnsupportedOperationException. Cópialo antes a unHashMapsi piensas editarlo. - Nada valida el mapa de alias localmente —
expressionAttributeNameses unMap<String, String>corriente.#proj3es obligatorio aquí porqueYeares una palabra reservada, y un alias que declaras pero nunca referencias es un error propio del lado del servicio: «Value provided in ExpressionAttributeNames unused in expressions». - Un cliente para toda la aplicación — AWS lo dice llanamente: "Service clients in the AWS SDK for Java 2.x are thread-safe." El bloque try-with-resources encaja en un
mainde un solo uso; en un servicio de larga vida, construye el cliente al arrancar y no lo cierres nunca por petición. .consistentRead(true)duplica el coste de lectura y se rechaza sobre un GSI. Si los mapas deAttributeValuese te quedan cortos, el DynamoDB Enhanced Client (software.amazon.awssdk.enhanced.dynamodb) mapea Items sobre beans anotados encima de estas mismas llamadas de bajo nivel.
Hazlo visualmente
Que esta lectura facture 0,5 o 1 unidad de capacidad se reduce a si el Item cabe en 4 KB. La calculadora de tamaño de Item mide un Item pegado contra ese límite.
DynoTable muestra los mismos Items como filas corrientes, y exporta la consulta que hay detrás de la cuadrícula como un programa Java construido con estos builders. Descarga DynoTable.
Ejemplos relacionados
- GetItem de DynamoDB en Go — la misma lectura con el SDK de AWS para Go v2.
- Query de DynamoDB en Java — leer una partición entera en vez de un solo Item.
- Cómo funcionan las claves de partición de DynamoDB — por qué
GetItemnecesita la clave completa. - DynamoDB ResourceNotFoundException — el primer error habitual aquí: nombre de tabla o región equivocados.
- «The provided key element does not match the schema» — la clave que pasas no coincide con el esquema de clave de la tabla.
Referencias
- 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
Verificado por última vez el 2026-07-28 contra la documentación oficial de AWS enlazada arriba.