DynamoDB DeleteItem em Java (AWS SDK v2)

Uma exclusão no AWS SDK for Java 2.x é um DeleteItemRequest carregando a chave primária completa, e ReturnValue.ALL_OLD te diz se havia mesmo alguma coisa lá.

Adicione um conditionExpression ao código abaixo e ele ganha um bug que continua compilando. O primeiro item da lista sob o trecho é esse bug.

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.DeleteItemRequest;
import software.amazon.awssdk.services.dynamodb.model.DeleteItemResponse;
import software.amazon.awssdk.services.dynamodb.model.DynamoDbException;
import software.amazon.awssdk.services.dynamodb.model.ReturnValue;

public class DeleteItemExample {
    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());

            DeleteItemRequest request = DeleteItemRequest.builder()
                    .tableName("Music")
                    .key(key)
                    .returnValues(ReturnValue.ALL_OLD)
                    .build();

            DeleteItemResponse response = ddb.deleteItem(request);
            if (response.attributes().isEmpty()) {
                System.out.println("No item with that key existed");
            } else {
                System.out.println("Deleted: " + response.attributes());
            }
        } catch (DynamoDbException e) {
            System.err.println(e.getMessage());
        }
    }
}

Explicação

  • ConditionalCheckFailedException estende DynamoDbException — então o bloco catch acima engole uma guarda que falhou e a imprime como se o serviço tivesse quebrado. Assim que a requisição passa a carregar um conditionExpression, capture primeiro o tipo mais específico. Uma condição que fez o seu trabalho é um resultado, não um erro.
  • A exceção carrega o item perdedor — coloque returnValuesOnConditionCheckFailure(ReturnValuesOnConditionCheckFailure.ALL_OLD) na requisição e e.item() devolve a linha como o DynamoDB a viu. A AWS informa o preço: "No read capacity units are consumed."
  • attributes() nunca retorna null — uma exclusão que não correspondeu a nada devolve um mapa vazio, então isEmpty() é o teste. hasAttributes() é o que separa "o serviço não retornou nada" de "o serviço retornou um mapa vazio".
  • O enum ReturnValue é compartilhado com UpdateItemreturnValues(ReturnValue.ALL_NEW) compila aqui e volta como um ValidationException, porque "DeleteItem does not recognize any values other than NONE or ALL_OLD". A sobrecarga String do builder esconde o mesmo erro (o conjunto completo).
  • Esvaziar uma tabela não é uma chamada de APIDeleteItem exclui exatamente uma chave, e nada no SDK exclui várias. Truncar uma tabela é um Scan atrás das chaves seguido de escritas em lote, e normalmente perde para DeleteTable mais CreateTable.

Faça isso visualmente

Se o atributo no qual você se apoia para a guarda é uma palavra reservada, a condição precisa de um alias #. O verificador de palavras reservadas te diz quais dos seus nomes de atributo estão na lista de 573 palavras da AWS e gera o mapa expressionAttributeNames para os que estiverem.

O DynoTable prepara uma exclusão em um painel de alterações pendentes antes que ela chegue à tabela. Cmd+Backspace prepara as linhas selecionadas, Cmd+Shift+Backspace exclui e faz o commit de uma vez, e qualquer coisa preparada pode ser descartada. Baixe o DynoTable.

Exemplos relacionados

Referências

Verificado pela última vez em 2026-07-28 contra a documentação oficial da AWS vinculada acima.

Trabalhe com o DynamoDB sem o Console

Um cliente desktop rápido para DynamoDB que roda o SQL de verdade que o DynamoDB não consegue — JOINs, GROUP BY, agregações — com edição visual e um agente de IA com suas próprias chaves do Bedrock.

Teste grátis de 30 dias, sem cartão de crédito — depois o plano Grátis sem limite de tempo.