

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

# Migre da versão 1.x para a 2.x do AWS SDK para Java
<a name="migration"></a>

O AWS SDK para Java 2.x é uma grande reescrita da base de código 1.x construída sobre o Java 8\$1. Ele inclui muitas atualizações, como melhor consistência, facilidade de uso e imutabilidade fortemente reforçada. Esta seção descreve os principais recursos que são novos na versão 2.x e fornece orientações sobre como migrar o código da versão 1.x para a 2.x.

**Topics**
+ [

## Novidades da versão 2
](#migration-whats-new)
+ [Encontrar aplicações usando clientes de 1.x](migration-find-apps-using-v1.md)
+ [Como migrar](migration-howto.md)
+ [O que é diferente entre o 1.x e o 2.x](migration-whats-different.md)
+ [

# Usar o SDK para Java 1.x e 2.x lado a lado
](migration-side-by-side.md)

## Novidades da versão 2
<a name="migration-whats-new"></a>
+ Você também pode configurar seus próprios clientes HTTP. Consulte [Configuração de transporte HTTP](http-configuration.md).
+ Os clientes assíncronos oferecem I/O suporte sem bloqueio e devolvem objetos. `CompletableFuture` Consulte [Programação assíncrona](asynchronous.md).
+ As operações que retornam várias páginas possuem respostas autopaginadas. Isso permite que você concentre o código no que vai ser feito com a resposta, sem a necessidade de verificar e obter páginas subsequentes. Consulte [Paginação](pagination.md). 
+ O desempenho das AWS Lambda funções no horário de início do SDK foi aprimorado. Consulte [Melhorias de desempenho do horário de início do SDK](lambda-optimize-starttime.md). 
+ A versão 2.x ofereça suporte a um novo método resumido para criar solicitações.  
**Example**  

  ```
  dynamoDbClient.putItem(request -> request.tableName(TABLE))
  ```

Para obter mais detalhes sobre os novos recursos e para exemplos de códigos específicos, consulte o as outras seções neste guia.
+  [Início rápido](get-started.md) 
+  [Configuração](setup.md) 
+  [Exemplos de código para o AWS SDK para Java 2.x](java_code_examples.md)
+  [Usar o SDK](using.md) 
+  [Segurança para o AWS SDK para Java](security.md) 

# Encontre aplicativos usando clientes AWS SDK para Java 1.x
<a name="migration-find-apps-using-v1"></a>

Antes de migrar para o AWS SDK for Java 2.x, você precisa identificar quais aplicativos em seu ambiente usam clientes SDK for Java 1.x. Você pode usar CloudTrail registros para rastrear o uso do SDK, pesquisar avisos de depreciação nos registros de aplicativos, inspecionar seu código-fonte e criar configurações ou examinar seus artefatos Java implantáveis. Use os métodos disponíveis em seu ambiente.

## Use o CloudTrail Lake para encontrar aplicativos com clientes 1.x
<a name="migration-find-v1-apps-with-cloudtrail"></a>

AWS CloudTrail O Lake permite que você consulte eventos registrados por CloudTrail. Siga estas etapas para criar um data lake que identifique as versões do SDK usadas pelas aplicações:

1. Crie um CloudTrail data lake. Consulte o [Guia do usuário](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/query-event-data-store.html) para criar um armazenamento de dados de eventos.

1. Depois de criar o datastore, examine o conteúdo de registros. O corpo do registro contém campos que determinam a ação, o tempo e o local solicitados. Para obter detalhes, consulte o [Guia do usuário para ver o conteúdo do CloudTrail registro](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-event-reference-record-contents.html).

1. Executar consultas com relação aos dados. Siga o [Guia do usuário para consultar e salvar os resultados de consulta](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/query-run-query.html).

O campo *userAgent* em cada registro contém a versão do SDK que fez a solicitação. Use esse campo para identificar aplicativos usando o SDK for Java 1.x.

O exemplo de consulta a seguir encontra todas as solicitações de aplicativos de usuário e ferramentas de terceiros feitas com o SDK for Java 1.x a partir de 17 de junho de 2025, para EventDatastore um ID: `sample-Data-Store-Id`

```
select userIdentity, eventSource, awsRegion,
    eventName, eventType, eventTime, userAgent,
    requestParameters, sourceIPAddress
 from sample-Data-Store-Id
where eventTime > '2025-06-17 00:00:00'
and userAgent like '%aws-sdk-java/1.%'
and userAgent not like '%aws-internal/%'
order by eventTime desc
```

Um exemplo do conteúdo do evento no resultado da consulta fica assim:

```
{
    "userIdentity": "{
         "type": "IAMUser",
         "principalId": "AIDAJ45Q7YFFAREXAMPLE",
         "arn": "arn:aws:iam::123456789012:user/Alice",
         "accountId": "123456789012",
         "accessKeyId": "",
         "userName": "Alice"
    }",
    "eventSource": "dynamodb.amazonaws.com",
    "awsRegion": "us-west-2",
    "eventName": "ListTables",
    "eventType": "AwsApiCall",
    "eventTime": "2025-07-01 02:23:52.000",
    "userAgent": "aws-sdk-java/1.12.746 Linux/5.10.240 OpenJDK/11.0.25+9-LTS ...",
    "requestParameters": "",
    "sourceIPAddress": "12.345.6.78"
}
```

É possível usar essas informações para ajudar a determinar quando e onde a solicitação foi feita.

No exemplo, uma solicitação `ListTables` do DynamoDB foi feita em `2025-07-01 02:23:52 (UTC)` pelo endereço IP `12.345.6.78` com as credenciais da usuária do IAM chamada Alice. O valor do campo *userAgent* mostra que a solicitação foi feita usando a AWS SDK para Java versão `1.12.746` de um sistema Linux com JDK 11.

Para obter uma descrição dos campos no registro do AWS CloudTrail evento, consulte o [conteúdo do CloudTrail registro para eventos de gerenciamento, dados e atividades de rede](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-event-reference-record-contents.html).

Se não CloudTrail estiver habilitado em sua conta, entre em contato com o administrador da AWS conta da sua organização para habilitá-lo ou use um dos métodos alternativos descritos nas seções a seguir.

CloudTrail O Lake cobra pelos dados ingeridos e pelos dados digitalizados por consulta. Para minimizar os custos, filtre as consultas para intervalos de tempo e regiões específicos. Para obter os preços atuais, consulte [Definição de preço do AWS CloudTrail](https://aws.amazon.com/cloudtrail/pricing/).

## Pesquise registros em nível de aviso do aplicativo para depreciação do SDK
<a name="migration-find-v1-apps-log-warning"></a>

A partir da versão 1.12.767 (lançada em 30 de julho de 2024), o AWS SDK para Java 1.x emite um aviso de depreciação na inicialização do aplicativo. Você pode pesquisar esse aviso nos registros do aplicativo para identificar quais aplicativos e hosts estão usando o SDK for Java 1.x.

O texto exato do aviso depende da versão do SDK:
+ Versões 1.12.767 a 1.12.796:

  `WARNING: The AWS SDK for Java 1.x entered maintenance mode starting July 31, 2024 and will reach end of support on December 31, 2025...`
+ Versões 1.12.797 e superiores:

  `WARNING: The AWS SDK for Java 1.x reached end of support on December 31, 2025...`

O final `...` indica que a mensagem de aviso continua com texto adicional. Você pode pesquisar o prefixo comum `The AWS SDK for Java 1.x` para encontrar qualquer uma das versões do aviso.

O exemplo a seguir demonstra a busca por esse aviso usando`grep`:

```
grep -r "The AWS SDK for Java 1.x" /path/to/your/application/logs/
```

Se o aviso for encontrado, o `grep` comando imprimirá as linhas de registro correspondentes. Se nenhum aviso for encontrado, seu aplicativo não está usando o SDK for Java 1.x ou usa uma versão anterior à 1.12.767. Nesse caso, use um dos outros métodos descritos neste documento.

## Pesquisar código-fonte e dependências
<a name="migration-find-v1-apps-source-code"></a>

Você pode pesquisar sua base de código e criar arquivos de configuração em busca de referências ao AWS SDK para Java 1.x. O identificador de chave é o ID do `com.amazonaws` grupo, que é usado por todos os artefatos do SDK for Java 1.x.

Os exemplos a seguir demonstram `grep` o uso para pesquisar `com.amazonaws` referências em arquivos comuns de projetos Java.

**Exemplo: pesquisar nos arquivos de origem Java as importações do SDK for Java 1.x (executar a partir do diretório raiz do projeto)**

```
grep -r "import com.amazonaws" --include="*.java" .
```

Resultado do exemplo:

```
src/main/java/com/example/App.java:import com.amazonaws.services.s3.AmazonS3;
```

**nota**  
O `com.amazonaws` pacote também é usado por bibliotecas que não fazem parte do SDK for Java 1.x, como. `aws-lambda-java-core` Para confirmar se uma importação é do SDK for Java 1.x, verifique se o ID do artefato correspondente na `pom.xml` sua`build.gradle`,, ou configuração de gerenciamento de dependências começa com. `aws-java-sdk-`

**Exemplo: pesquise nos `pom.xml` arquivos Maven as dependências do SDK for Java 1.x (execute a partir do diretório raiz do projeto)**

```
grep -r "com.amazonaws" --include="pom.xml" .
```

Resultado do exemplo:

```
pom.xml:    <groupId>com.amazonaws</groupId>
```

**Exemplo: pesquise dependências do SDK for Java 1.x nos arquivos de compilação do Gradle (execute a partir do diretório raiz do projeto)**

```
grep -r "com.amazonaws:aws-java-sdk" --include="*.gradle" .
```

Resultado do exemplo:

```
build.gradle:    implementation 'com.amazonaws:aws-java-sdk-s3:1.12.xxx'
```

Os `grep` comandos anteriores identificam as referências do SDK for Java 1.x declaradas diretamente nos seus arquivos de origem e de compilação. No entanto, seu aplicativo também pode depender do SDK for Java 1.x de forma transitiva — por meio de uma biblioteca de terceiros que, por sua vez, depende do SDK. Use a árvore de dependências da sua ferramenta de construção para encontrar dependências diretas e transitivas do SDK for Java 1.x. Escolha o exemplo que corresponda ao seu sistema de compilação.

**Exemplo: use o Maven para encontrar todas as dependências transitivas do SDK for Java 1.x (executado a partir do diretório raiz do projeto)**

```
mvn dependency:tree -Dincludes=com.amazonaws
```

Resultado do exemplo:

```
[INFO] com.example:my-application:jar:1.0-SNAPSHOT
[INFO] +- com.amazonaws:aws-java-sdk-s3:jar:1.12.746:compile
[INFO] |  \- com.amazonaws:aws-java-sdk-core:jar:1.12.746:compile
[INFO] \- some.thirdparty:library:jar:2.3.1:compile
[INFO]    \- com.amazonaws:aws-java-sdk-dynamodb:jar:1.12.600:compile
```

O `-Dincludes=com.amazonaws` sinalizador filtra a árvore para mostrar somente artefatos do SDK for Java 1.x. Neste exemplo, `aws-java-sdk-s3` é uma dependência direta, mas `aws-java-sdk-dynamodb` é uma dependência transitiva trazida por. `some.thirdparty:library`

**Exemplo: use o Gradle para encontrar todas as dependências transitivas do SDK for Java 1.x (executado a partir do diretório raiz do projeto)**

```
gradle dependencies --configuration runtimeClasspath | grep "com.amazonaws"
```

Resultado do exemplo:

```
+--- com.amazonaws:aws-java-sdk-s3:1.12.746
|    \--- com.amazonaws:aws-java-sdk-core:1.12.746
\--- com.amazonaws:aws-java-sdk-dynamodb:1.12.600
```

O Gradle não tem um filtro de dependência embutido equivalente ao do Maven`-Dincludes`, então usar a canalização `grep` é a abordagem mais simples.

## Inspecione artefatos Java implantáveis
<a name="migration-find-v1-apps-inspect-artifacts"></a>

Você pode inspecionar seus artefatos Java implantáveis (JARs WARs, ou EARs) para confirmar se o AWS SDK para Java 1.x está empacotado com seu aplicativo. Os arquivos de arquivamento Java são arquivos no formato ZIP. Para determinar se o SDK for Java 1.x está presente, procure o `com/amazonaws/sdk/versionInfo.properties` arquivo dentro do arquivo. Esse arquivo está incluído no `aws-java-sdk-core` módulo e contém o número da versão do SDK.

### Verificação rápida com o `jar` comando
<a name="migration-find-v1-apps-jar-command"></a>

Para uber-jars em que todas as classes de dependência são mescladas no nível superior, liste o conteúdo do arquivo e pesquise o arquivo de versão:

Nos exemplos a seguir, `myapp.jar` substitua pelo caminho para o arquivo JAR do seu aplicativo.

```
jar -tf myapp.jar | grep 'versionInfo.properties'
```

Se o SDK estiver presente, a saída será:

```
com/amazonaws/sdk/versionInfo.properties
```

Se o `jar` comando não estiver disponível em seu ambiente (por exemplo, imagens de contêiner mínimas ou somente JRE), você poderá usar `unzip -l` em vez disso:

```
unzip -l myapp.jar | grep 'versionInfo.properties'
```

Para imprimir a versão:

```
unzip -p myapp.jar com/amazonaws/sdk/versionInfo.properties
```

Resultado do exemplo:

```
platform=java
version=1.12.xxx
```

**nota**  
Os comandos anteriores pesquisam somente entradas de nível superior em uber-jars. Eles não encontrarão classes de SDK em thin JARs (onde as dependências são externas) ou aninhadas internamente JARs (como aquelas em WARs, EARs ou pacotes Lambda em ou). `lib/` `WEB-INF/lib/` Em vez disso JARs, verifique sua configuração de compilação (`pom.xml`,`build.gradle`) ou árvore de dependências. Para aninhado JARs, pesquise o pacote JARs usando uma ferramenta que pode ler arquivos ZIP recursivamente sem extrair para o disco.

# Como migrar seu código de AWS SDK para Java 1.x para 2.x
<a name="migration-howto"></a>

Você pode migrar aplicações existentes do SDK para Java 1.x de duas formas.

1. Abordagem automatizada usando a [ferramenta de migração](migration-tool.md).

1. [Abordagem manual](migration-steps.md) substituindo incrementalmente as importações de 1.x por importações de 2.x.

Recomendamos que você comece usando a ferramenta de migração. Ela automatiza grande parte da rotina de substituir o código de 1.x para 2.x. 

Como a ferramenta [não migra todos os recursos](migration-tool.md#migration-tool-limitations), você precisará pesquisar o código de v1 restante depois de executar a ferramenta. Quando você encontrar um código que a ferramenta não migrou, siga as [step-by-step instruções](migration-steps.md) (abordagem manual) e use os [artigos do guia de migração](migration-whats-different.md) para concluir a migração.

**Topics**
+ [Ferramenta de migração](migration-tool.md)
+ [Step-by-step instruções](migration-steps.md)

# Ferramenta de migração do AWS SDK para Java
<a name="migration-tool"></a>

O AWS SDK para Java fornece uma ferramenta de migração que ajuda a automatizar a migração do código do SDK para Java 1.x (V1) para 2.x (V2). A ferramenta usa o [OpenRewrite](https://docs.openrewrite.org/), uma ferramenta de refatoração de código-fonte e código aberto, para fazer a migração. O OpenRewrite usa regras de modificação de código (chamadas de “receitas”) para atualizar automaticamente o código-fonte da sintaxe e dos padrões da V1 para a V2.

A ferramenta permite regras de modificação de código para clientes de serviços do SDK e para a biblioteca de alto nível do [Gerenciador de Transferências do S3](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/transfer/TransferManager.html). As regras de modificação de código para outras APIs de alto nível, como da V1 da API [https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/datamodeling/DynamoDBMapper.html](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/datamodeling/DynamoDBMapper.html) para a V2 da [API de cliente avançado do DynamoDB](dynamodb-enhanced-client.md) não são compatíveis. 

Consulte mais detalhes sobre limitações no [final desta página](#migration-tool-limitations). Consulte exemplos detalhados de padrões de código comuns sem suporte com etapas de migração manual em [Padrões de código sem suporte](migration-tool-unsupported-patterns.md).

## Usar a ferramenta de migração
<a name="migration-tool-use"></a>

### Migrar um projeto Maven
<a name="migration-tool-use-maven"></a>

Siga as instruções abaixo para migrar seu projeto baseado no Maven do SDK para Java 1.x usando a ferramenta de [plug-in OpenRewrite Maven](https://docs.openrewrite.org/reference/rewrite-maven-plugin).

1. Acesse o diretório-raiz do projeto Maven

   Abra uma janela de terminal (linha de comando) e acesse o diretório-raiz da aplicação baseada no Maven.

1. Execute o comando `rewrite-maven-plugin` do plugin

   É possível escolher entre dois modos (metas do Maven): `dryRun` e `run`.

   **`dryRun`**** Modo**

   No modo `dryRun`, o plug-in gera logs de diferenças na saída do console e um arquivo de patch chamado `rewrite.patch` na pasta `target/rewrite`. Esse modo permite que você visualize as alterações que seriam feitas, já que nenhuma alteração é feita nos arquivos de código-fonte. 

   O exemplo a seguir mostra como invocar o plug-in no modo `dryRun`.

   ```
   mvn org.openrewrite.maven:rewrite-maven-plugin:<rewrite-plugin-version>*:dryRun \
     -Drewrite.recipeArtifactCoordinates=software.amazon.awssdk:v2-migration:<sdkversion>** \
     -Drewrite.activeRecipes=software.amazon.awssdk.v2migration.AwsSdkJavaV1ToV2
   ```

   \$1Substitua *<rewrite-plugin-version>* pelo valor de `rewriteMavenPluginVersion` exibido neste [arquivo de teste](https://github.com/aws/aws-sdk-java-v2/blob/3a01289246f1f4ac814a354051d00030e53ef968/test/v2-migration-tests/src/test/java/software/amazon/awssdk/v2migrationtests/MavenTestBase.java#L54).

   \$1\$1Substitua *<sdkversion>* por uma versão 2.x do SDK. Confira a versão mais recente em [Maven Central](https://central.sonatype.com/artifact/software.amazon.awssdk/v2-migration). 
**Importante**  
Use a versão de `rewrite-maven-plugin` mostrada no [arquivo de teste](https://github.com/aws/aws-sdk-java-v2/blob/3a01289246f1f4ac814a354051d00030e53ef968/test/v2-migration-tests/src/test/java/software/amazon/awssdk/v2migrationtests/MavenTestBase.java#L54), pois outras versões podem não funcionar.

   A saída do console do modo `dryRun` deve ser semelhante à saída a seguir.

   ```
   [WARNING] These recipes would make changes to project/src/test/resources/maven/before/pom.xml:
   [WARNING]     software.amazon.awssdk.v2migration.AwsSdkJavaV1ToV2
   [WARNING]         software.amazon.awssdk.v2migration.UpgradeSdkDependencies
   [WARNING]             org.openrewrite.java.dependencies.AddDependency: {groupId=software.amazon.awssdk, artifactId=apache-client, version=2.27.0, onlyIfUsing=com.amazonaws.ClientConfiguration}
   [WARNING]             org.openrewrite.java.dependencies.AddDependency: {groupId=software.amazon.awssdk, artifactId=netty-nio-client, version=2.27.0, onlyIfUsing=com.amazonaws.ClientConfiguration}
   [WARNING]             org.openrewrite.java.dependencies.ChangeDependency: {oldGroupId=com.amazonaws, oldArtifactId=aws-java-sdk-bom, newGroupId=software.amazon.awssdk, newArtifactId=bom, newVersion=2.27.0}
   [WARNING]             org.openrewrite.java.dependencies.ChangeDependency: {oldGroupId=com.amazonaws, oldArtifactId=aws-java-sdk-s3, newGroupId=software.amazon.awssdk, newArtifactId=s3, newVersion=2.27.0}
   [WARNING]             org.openrewrite.java.dependencies.ChangeDependency: {oldGroupId=com.amazonaws, oldArtifactId=aws-java-sdk-sqs, newGroupId=software.amazon.awssdk, newArtifactId=sqs, newVersion=2.27.0}
   [WARNING] These recipes would make changes to project/src/test/resources/maven/before/src/main/java/foo/bar/Application.java:
   [WARNING]     software.amazon.awssdk.v2migration.AwsSdkJavaV1ToV2
   [WARNING]         software.amazon.awssdk.v2migration.S3GetObjectConstructorToFluent
   [WARNING]             software.amazon.awssdk.v2migration.ConstructorToFluent
   [WARNING]         software.amazon.awssdk.v2migration.S3StreamingResponseToV2
   [WARNING]         software.amazon.awssdk.v2migration.ChangeSdkType
   [WARNING]         software.amazon.awssdk.v2migration.ChangeSdkCoreTypes
   [WARNING]             software.amazon.awssdk.v2migration.ChangeExceptionTypes
   [WARNING]                 org.openrewrite.java.ChangeType: {oldFullyQualifiedTypeName=com.amazonaws.AmazonClientException, newFullyQualifiedTypeName=software.amazon.awssdk.core.exception.SdkException}
   [WARNING]                 org.openrewrite.java.ChangeMethodName: {methodPattern=com.amazonaws.AmazonServiceException getRequestId(), newMethodName=requestId}
   [WARNING]                 org.openrewrite.java.ChangeMethodName: {methodPattern=com.amazonaws.AmazonServiceException getErrorCode(), newMethodName=awsErrorDetails().errorCode}
   [WARNING]                 org.openrewrite.java.ChangeMethodName: {methodPattern=com.amazonaws.AmazonServiceException getServiceName(), newMethodName=awsErrorDetails().serviceName}
   [WARNING]                 org.openrewrite.java.ChangeMethodName: {methodPattern=com.amazonaws.AmazonServiceException getErrorMessage(), newMethodName=awsErrorDetails().errorMessage}
   [WARNING]                 org.openrewrite.java.ChangeMethodName: {methodPattern=com.amazonaws.AmazonServiceException getRawResponse(), newMethodName=awsErrorDetails().rawResponse().asByteArray}
   [WARNING]                 org.openrewrite.java.ChangeMethodName: {methodPattern=com.amazonaws.AmazonServiceException getRawResponseContent(), newMethodName=awsErrorDetails().rawResponse().asUtf8String}
   [WARNING]                 org.openrewrite.java.ChangeType: {oldFullyQualifiedTypeName=com.amazonaws.AmazonServiceException, newFullyQualifiedTypeName=software.amazon.awssdk.awscore.exception.AwsServiceException}
   [WARNING]         software.amazon.awssdk.v2migration.NewClassToBuilderPattern
   [WARNING]             software.amazon.awssdk.v2migration.NewClassToBuilder
   [WARNING]             software.amazon.awssdk.v2migration.V1SetterToV2
   [WARNING]         software.amazon.awssdk.v2migration.V1GetterToV2
   ...
   [WARNING]         software.amazon.awssdk.v2migration.V1BuilderVariationsToV2Builder
   [WARNING]         software.amazon.awssdk.v2migration.NewClassToBuilderPattern
   [WARNING]             software.amazon.awssdk.v2migration.NewClassToBuilder
   [WARNING]             software.amazon.awssdk.v2migration.V1SetterToV2
   [WARNING]         software.amazon.awssdk.v2migration.HttpSettingsToHttpClient
   [WARNING]         software.amazon.awssdk.v2migration.WrapSdkClientBuilderRegionStr
   [WARNING] Patch file available:
   [WARNING]     project/src/test/resources/maven/before/target/rewrite/rewrite.patch
   [WARNING] Estimate time saved: 20m
   [WARNING] Run 'mvn rewrite:run' to apply the recipes.
   ```

   **`run`**** Modo**

   Quando você executa o plug-in no modo `run`, ele modifica o código-fonte no disco para aplicar as alterações. Faça backup do código-fonte antes de executar o comando.

   O exemplo a seguir mostra como invocar o plug-in no modo `run`.

   ```
   mvn org.openrewrite.maven:rewrite-maven-plugin:<rewrite-plugin-version>*:run \
     -Drewrite.recipeArtifactCoordinates=software.amazon.awssdk:v2-migration:<sdkversion>** \
     -Drewrite.activeRecipes=software.amazon.awssdk.v2migration.AwsSdkJavaV1ToV2
   ```

   \$1Substitua *<rewrite-plugin-version>* pelo `rewriteMavenPluginVersionvalue` exibido neste [arquivo de teste](https://github.com/aws/aws-sdk-java-v2/blob/3a01289246f1f4ac814a354051d00030e53ef968/test/v2-migration-tests/src/test/java/software/amazon/awssdk/v2migrationtests/MavenTestBase.java#L54).

   \$1\$1Substitua *<sdkversion>* por uma versão 2.x do SDK. Confira a versão mais recente em [Maven Central](https://central.sonatype.com/artifact/software.amazon.awssdk/v2-migration). 

   Depois de executar o comando, faça uma compilação da aplicação e realize testes para verificar as alterações. 

### Migrar um projeto Gradle
<a name="migration-tool-use-gradle"></a>

Siga as instruções abaixo para migrar seu projeto baseado no Gradle do SDK para Java 1.x usando a ferramenta de [plug-in OpenRewrite Gradle](https://docs.openrewrite.org/reference/gradle-plugin-configuration).

1. Acesse o diretório-raiz do projeto Gradle

   Abra uma janela de terminal (linha de comando) e acesse o diretório-raiz da aplicação baseada no Gradle.

1. Criar um script de inicialização do Gradle

   Crie um arquivo `init.gradle` com o conteúdo a seguir no diretório.

   ```
   initscript {
       repositories {
           maven { url "https://plugins.gradle.org/m2" }
       }
       dependencies {
           classpath("org.openrewrite:plugin:<rewrite-plugin-version>*")
       }
   }
   
   rootProject {
       plugins.apply(org.openrewrite.gradle.RewritePlugin)
       dependencies {
           rewrite("software.amazon.awssdk:v2-migration:latest.release")
       }
   
       afterEvaluate {
           if (repositories.isEmpty()) {
               repositories {
                   mavenCentral()
               }
           }
       }
   }
   ```

   \$1Substitua *<rewrite-plugin-version>* pela versão exibida neste [arquivo de teste](https://github.com/aws/aws-sdk-java-v2/blob/master/test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/gradle/before/init.gradle#L6).

1. Execute o comando `rewrite`

   Assim como no plug-in Maven, você pode executar o plug-in Gradle no modo `dryRun` or `run`.

   **Modo `dryRun`**

   O exemplo a seguir mostra como invocar o plug-in no modo `dryRun`.

   ```
   gradle rewriteDryRun --init-script init.gradle \
     -Drewrite.activeRecipes=software.amazon.awssdk.v2migration.AwsSdkJavaV1ToV2
   ```

   **Modo `run`**

   O exemplo a seguir mostra como invocar o plug-in no modo `run`.

   ```
   gradle rewriteRun --init-script init.gradle \
     -Drewrite.activeRecipes=software.amazon.awssdk.v2migration.AwsSdkJavaV1ToV2
   ```

## Limitações atuais
<a name="migration-tool-limitations"></a>

Embora a migração seja compatível com a maioria dos códigos da V1 por meio de regras de modificação de código que são atualizadas para o equivalente da V2, algumas classes e métodos não são abordados. Referente a essas classes e métodos, siga as [instruções passo a passo](migration-steps.md) para migrar o código manualmente.

Para algumas regras de modificação de código incompatíveis, a ferramenta de migração pode adicionar um comentário que comece com:

```
/*AWS SDK for Java v2 migration: Transform for ...
```

Após o comentário, a ferramenta gera um esboço genérico da versão V2 do método ou da classe. Por exemplo, na saída a seguir, a ferramenta de migração tentou migrar o método `setBucketLifecycleConfiguration` do cliente V1 do S3:

```
/*AWS SDK for Java v2 migration: Transform for setBucketLifecycleConfiguration method not supported. 
Please manually migrate your code by using builder pattern, update from BucketLifecycleConfiguration.Rule 
to LifecycleRule, StorageClass to TransitionStorageClass, and adjust imports and names.*/
s3.putBucketLifecycleConfiguration(
        PutBucketLifecycleConfigurationRequest.builder()
            .bucket(bucketName)
            .lifecycleConfiguration(BucketLifecycleConfiguration.builder()
                .build())
            .build());
```

Os links na lista abaixo abrem informações de migração para ajudar você a migrar o código manualmente.
+ [Diferenças do cliente S3 entre a versão 1 e a versão 2 do AWS SDK para Java](migration-s3-client.md)
+ [Gerenciador de Transferências do S3](migration-s3-transfer-manager.md) (TransferManager)
+ [Mapeamento de objetos do DynamoDB](migration-ddb-mapper.md) (DynamoDBMapper)
+ [Utilitário de metadados do EC2](migration-imds.md) (EC2MetadataUtils)
+ [Waiters](migration-waiters.md) (AmazonDynamoDBWaiters)
+ [Compilador de Políticas do IAM](migration-iam-policy-builder.md) (Policy)
+ [Pré-assinatura do CloudFront](migration-cloudfront-presigning.md) (CloudFrontUrlSigner, CloudFrontCookieSigner)
+ [Notificações de Eventos do S3](migration-s3-event-notification.md) (S3EventNotification)
+ Publicação de métricas do SDK ([documentação da 1.x](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/generating-sdk-metrics.html), [documentação da 2.x](metrics.md))
+ [Padrões de código incompatíveis](migration-tool-unsupported-patterns.md): exemplos detalhados de padrões de código comuns que exigem migração manual

# Padrões de código incompatíveis da ferramenta de migração
<a name="migration-tool-unsupported-patterns"></a>

A ferramenta de migração converte automaticamente a maior parte do código da v1 para a v2. No entanto, alguns padrões de código exigem migração manual. Este tópico fornece exemplos detalhados dos padrões incompatíveis mais comuns e mostra como convertê-los manualmente.

A lista de padrões a seguir não está completa. Se seu código não for compilado após a execução da ferramenta de migração, siga as [instruções de step-by-step migração](migration-steps.md) para migrar manualmente o código v1 restante.

## Solicitar construtores de objetos com parâmetros
<a name="request-pojo-constructors"></a>

Para solicitação POJOs (excluindo o Amazon S3), a ferramenta de migração transforma somente os métodos setter. A ferramenta não é compatível com construtores com parâmetros.

**Padrão compatível: objeto de solicitação usando setters (sem parâmetros de construtor)**

Antes (código original da v1):

```
import com.amazonaws.services.sqs.model.SendMessageRequest;

SendMessageRequest request = new SendMessageRequest().withMessageBody("Hello World");
request.setQueueUrl("https://sqs.us-west-2.amazonaws.com/0123456789012/demo-queue");
```

Depois (resultado da ferramenta de migração):

```
import software.amazon.awssdk.services.sqs.model.SendMessageRequest;

SendMessageRequest request = SendMessageRequest.builder()
    .messageBody("Hello World").build();
request = request.toBuilder()
    .queueUrl("https://sqs.us-west-2.amazonaws.com/0123456789012/demo-queue").build();
```

**Padrão incompatível: construtor de objeto de solicitação com parâmetros**

A ferramenta de migração não pode converter construtores com parâmetros:

Antes da migração manual, mas depois da ferramenta de migração:

```
import software.amazon.awssdk.services.sqs.model.SendMessageRequest; // Import updated to v2.

// This pattern requires manual migration.
SendMessageRequest request = new SendMessageRequest(
    "https://sqs.us-west-2.amazonaws.com/0123456789012/demo-queue", 
    "Hello World");
```

A ferramenta de migração transforma a importação para a v2, mas o código do construtor permanece inalterado e requer atualizações manuais para usar o padrão do construtor.

Após a migração manual:

```
import software.amazon.awssdk.services.sqs.model.SendMessageRequest;

SendMessageRequest request = SendMessageRequest.builder()
    .messageBody("Hello World")
    .queueUrl("https://sqs.us-west-2.amazonaws.com/0123456789012/demo-queue")
    .build();
```

## Métodos do cliente de serviço com parâmetros individuais
<a name="service-client-method-overloads"></a>

A ferramenta de migração não pode converter métodos de cliente de serviço que usam parâmetros individuais em vez de objetos de solicitação (exceto Amazon S3).

Antes (código da v1):

```
import com.amazonaws.services.sqs.AmazonSQS;
import com.amazonaws.services.sqs.AmazonSQSClient;

AmazonSQS sqs = new AmazonSQSClient();
// The following v1 method takes individual parameters.
sqs.sendMessage("https://sqs.us-west-2.amazonaws.com/0123456789012/demo-queue", "Hello World");
```

Depois (resultado da ferramenta de migração: não compila):

```
import software.amazon.awssdk.services.sqs.SqsClient;  // Import updated to v2.
// No import statement for the v2 request POJO.

SqsClient sqs = SqsClient.builder().build();

// Does not compile–v2 methods only accept request POJOs.
sqs.sendMessage("https://sqs.us-west-2.amazonaws.com/0123456789012/demo-queue", "Hello World");
```

Você deve atualizar manualmente os argumentos do método para usar um objeto de solicitação:

```
import software.amazon.awssdk.services.sqs.SqsClient;
import software.amazon.awssdk.services.sqs.model.SendMessageRequest; // Add manually.

SqsClient sqs = SqsClient.builder().build();

// Corrected v2 code.
SendMessageRequest request = SendMessageRequest.builder()
    .queueUrl("https://sqs.us-west-2.amazonaws.com/0123456789012/demo-queue")
    .messageBody("Hello World")
    .build();
sqs.sendMessage(request);
```

## Métodos de tempo limite da solicitação
<a name="request-pojo-timeout-configuration"></a>

A ferramenta de migração não converte métodos que definem tempo limite em objetos de solicitação.

Antes (código da v1):

```
import com.amazonaws.services.sqs.model.SendMessageRequest;

SendMessageRequest request = new SendMessageRequest();
request.setSdkRequestTimeout(7);
```

Depois (resultado da ferramenta de migração: não compila):

```
import software.amazon.awssdk.services.sqs.model.SendMessageRequest;  // Import updated to v2.

SendMessageRequest request = SendMessageRequest.builder().build();

// Does not compile.
request.setSdkRequestTimeout(7);
```

Você deve migrar manualmente para usar o método `overrideConfiguration` da v2:

```
import software.amazon.awssdk.services.sqs.model.SendMessageRequest;
import java.time.Duration;

SendMessageRequest request = SendMessageRequest.builder().build();

// Corrected v2 code.
request = request.toBuilder()
    .overrideConfiguration(o -> o.apiCallTimeout(Duration.ofSeconds(7)))
    .build();
```

## Construtores de clientes de serviço com parâmetros
<a name="service-client-constructors-with-args"></a>

A ferramenta de migração converte construtores de cliente de serviço vazios, mas não pode converter construtores que aceitam parâmetros como credenciais ou configuração.

Antes (código da v1):

```
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.sqs.AmazonSQS;
import com.amazonaws.services.sqs.AmazonSQSClient;

AWSCredentials awsCredentials = new BasicAWSCredentials("akid", "skid");
AmazonSQS sqs = new AmazonSQSClient(awsCredentials);
```

Depois (resultado da ferramenta de migração: não compila):

```
import software.amazon.awssdk.auth.credentials.AwsCredentials;
import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
import software.amazon.awssdk.services.sqs.SqsClient;  // Import updated to v2.

AwsCredentials awsCredentials = AwsBasicCredentials.create("akid", "skid");

// Does not compile.
SqsClient sqs = new SqsClient(awsCredentials);
```

Você deve atualizar manualmente o construtor do cliente de serviço para usar o padrão do compilador:

```
import software.amazon.awssdk.auth.credentials.AwsCredentials;
import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;  // Add manually.
import software.amazon.awssdk.services.sqs.SqsClient;

AwsCredentials awsCredentials = AwsBasicCredentials.create("akid", "skid");

// Corrected v2 code.
SqsClient sqs = SqsClient.builder()
    .credentialsProvider(StaticCredentialsProvider.create(awsCredentials))
    .build();
```

# step-by-stepInstruções de migração com exemplo
<a name="migration-steps"></a>

Esta seção fornece um step-by-step guia para migrar seu aplicativo que atualmente usa o SDK for Java v1.x para o SDK for Java 2.x. A primeira parte apresenta uma visão geral das etapas seguidas por um exemplo detalhado de uma migração.

As etapas abordadas aqui descrevem a migração de um caso de uso normal, em que o aplicativo chama Serviços da AWS usando clientes de serviço orientados por modelos. Se você precisar migrar código que usa um nível superior APIs , como o [S3 Transfer Manager](migration-s3-transfer-manager.md) ou a [CloudFrontpré-assinatura](migration-cloudfront-presigning.md), consulte a seção abaixo do [O que há de diferente entre AWS SDK para Java 1.x e 2.x](migration-whats-different.md) índice.



A abordagem descrita aqui é uma sugestão. Você pode usar outras técnicas e aproveitar os recursos de edição de código do IDE para alcançar o mesmo resultado. 

## Visão geral das etapas
<a name="migration-steps-overview"></a>

### 1. Comece adicionando o BOM do SDK para Java 2.x
<a name="migration-steps-overview-step1"></a>

Ao adicionar o elemento BOM (Lista de materiais) do Maven para o SDK para Java 2.x ao arquivo POM, você garante que todas as dependências necessárias da v2 sejam da mesma versão. O POM pode conter dependências da v1 e da v2. Isso permite migrar o código de forma incremental em vez de alterá-lo de uma só vez.

#### BOM do SDK para Java 2.x
<a name="drt_b5n_q1c"></a>

```
<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>software.amazon.awssdk</groupId>
      <artifactId>bom</artifactId>
      <version>2.27.21</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>
```

É possível encontrar a [versão mais recente](https://central.sonatype.com/artifact/software.amazon.awssdk/bom) no repositório do Maven Central.

### 2. Pesquisar arquivos para declarações de importação de classe da v1
<a name="migration-steps-overview-step2"></a>

Ao escanear os arquivos em seu aplicativo em busca de SERVICE\$1 IDs usado nas importações v1, você encontrará o SERVICE\$1 exclusivo usado. IDs Um SERVICE\$1ID é um nome curto e exclusivo para um. AWS service (Serviço da AWS) Por exemplo, `cognitoidentity` é o SERVICE\$1ID do Amazon Cognito Identity.

### 3. Determine as dependências da v2 do Maven com base nas declarações de importação da v1
<a name="migration-steps-overview-step3"></a>

Depois de encontrar todos os exclusivos v1 SERVICE\$1IDs, você pode determinar o artefato Maven correspondente para a dependência v2 consultando a. [Nome do pacote para mapeamentos de artifactId do Maven.](#migration-serviceid-artifactid-mapping)

### 4. Adicionar elementos de dependência da v2 ao arquivo POM
<a name="migration-steps-overview-step4"></a>

Atualize o arquivo POM do Maven com os elementos de dependência determinados na etapa 3.

### 5. Nos arquivos Java, altere incrementalmente as classes da v1 para as classes da v2
<a name="migration-steps-overview-step5"></a>

Ao substituir as classes da v1 por classes da v2, faça as alterações necessárias para dar suporte à API da v2, como usar compiladores em vez de construtores e usar getters e setters fluentes.

### 6. Remova as dependências da v1 do Maven das importações do POM e da v1 dos arquivos
<a name="migration-steps-overview-step6"></a>

Depois de migrar o código para usar classes da v2, remova todas as importações da v1 restantes dos arquivos e todas as dependências do arquivo de compilação.

### 7. Refatorar o código para usar os aprimoramentos da API da v2
<a name="migration-steps-overview-step7"></a>

Depois que o código for compilado e aprovado nos testes, você poderá aproveitar os aprimoramentos da v2, como usar um cliente HTTP diferente ou paginadores para simplificar o código. Esta é uma etapa opcional.

## Exemplo de migração
<a name="migration-steps-example"></a>

Neste exemplo, migramos uma aplicação que usa o SDK para Java v1 e acessa vários Serviços da AWS. Trabalhamos detalhadamente com o seguinte método da v1 na etapa 5. Esse é um método em uma classe que contém oito métodos e há 32 classes na aplicação.

### método da v1 para migrar
<a name="v1-snippet-collapsed"></a>

Somente as importações do SDK da v1 estão listadas abaixo no arquivo Java.

```
import com.amazonaws.ClientConfiguration;
import com.amazonaws.regions.Region;
import com.amazonaws.regions.RegionUtils;
import com.amazonaws.services.ec2.AmazonEC2Client;
import com.amazonaws.services.ec2.model.AmazonEC2Exception;
import com.amazonaws.services.ec2.model.CreateTagsRequest;
import com.amazonaws.services.ec2.model.DescribeInstancesRequest;
import com.amazonaws.services.ec2.model.DescribeInstancesResult;
import com.amazonaws.services.ec2.model.Instance;
import com.amazonaws.services.ec2.model.InstanceStateName;
import com.amazonaws.services.ec2.model.Reservation;
import com.amazonaws.services.ec2.model.Tag;
import com.amazonaws.services.ec2.model.TerminateInstancesRequest;
...
private static List<Instance> getRunningInstances(AmazonEC2Client ec2, List<String> instanceIds) {
    List<Instance> runningInstances = new ArrayList<>();
    try {
        DescribeInstancesRequest request = new DescribeInstancesRequest()
                .withInstanceIds(instanceIds);
        DescribeInstancesResult result;
        do {
            // DescribeInstancesResponse is a paginated response, so use tokens with multiple requests.
            result = ec2.describeInstances(request);
            request.setNextToken(result.getNextToken());   // Prepare request for next page.
            for (final Reservation r : result.getReservations()) {
                for (final Instance instance : r.getInstances()) {
                    LOGGER.info("Examining instanceId: "+ instance.getInstanceId());
                    // if instance is in a running state, add it to runningInstances list.
                    if (RUNNING_STATES.contains(instance.getState().getName())) {
                        runningInstances.add(instance);
                    }
                }
            }
        } while (result.getNextToken() != null);
    } catch (final AmazonEC2Exception exception) {
        // if instance isn't found, assume its terminated and continue.
        if (exception.getErrorCode().equals(NOT_FOUND_ERROR_CODE)) {
            LOGGER.info("Instance probably terminated; moving on.");
        } else {
            throw exception;
        }
    }
    return runningInstances;
}
```

### 1. Adicionar BOM da v2 do Maven
<a name="migration-steps-example-step1"></a>

Adicione o BOM do Maven para o SDK para Java 2.x ao POM junto com quaisquer outras dependências na seção `dependencyManagement`. Se o arquivo POM tiver o BOM da v1 do SDK, deixe-o por enquanto. Ele será removido em uma etapa posterior.

#### Gerenciamento de dependências do POM no início
<a name="migration-example-boms"></a>

```
<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.example</groupId>             <!--Existing dependency in POM. -->
      <artifactId>bom</artifactId>
      <version>1.3.4</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
    ...
    <dependency>
      <groupId>com.amazonaws</groupId>
      <artifactId>aws-java-sdk-bom</artifactId>  <!--Existing v1 BOM dependency. -->
      <version>1.11.1000</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
    ...
    <dependency>
      <groupId>software.amazon.awssdk</groupId>  <!--Add v2 BOM dependency. -->
      <artifactId>bom</artifactId>
      <version>2.27.21</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>
```

### 2. Pesquisar arquivos para declarações de importação de classe da v1
<a name="migration-steps-example-step2"></a>

Pesquise o código da aplicação em busca de ocorrências exclusivas de `import com.amazonaws.services`. Isso nos ajuda a determinar as dependências da v1 usadas pelo projeto. Se a aplicação tiver um arquivo POM do Maven com dependências da v1 listadas, você poderá usar essas informações em vez disso. 

Neste exemplo, usamos o comando [`ripgrep` (rg)](https://github.com/BurntSushi/ripgrep) para pesquisar a base de código.

Da raiz da base de código, execute o comando `ripgrep` a seguir. Depois de `ripgrep` encontrar as instruções de importação, elas são canalizadas para os `uniq` comandos `cut``sort`, e para isolar o SERVICE\$1. IDs 

```
rg --no-filename 'import\s+com\.amazonaws\.services' | cut -d '.' -f 4 | sort | uniq
```

Para esse aplicativo, os seguintes SERVICE\$1 IDs são registrados no console.

```
autoscaling
cloudformation
ec2
identitymanagement
```

Isso indica que houve pelo menos uma ocorrência de cada um dos seguintes nomes de pacotes usados nas declarações `import`. Para nossos propósitos, os nomes das classes individuais não importam. Só precisamos encontrar os SERVICE\$1 IDs que são usados.

```
com.amazonaws.services.autoscaling.*
com.amazonaws.services.cloudformation.*
com.amazonaws.services.ec2.*
com.amazonaws.services.identitymanagement.*
```

### 3. Determine as dependências da v2 do Maven com base nas declarações de importação da v1
<a name="migration-steps-example-step3"></a>

O SERVICE\$1 IDs para v1 que isolamos da Etapa 2 — por exemplo, `autoscaling` e `cloudformation` — pode ser mapeado para o mesmo SERVICE\$1ID v2 na maior parte. Como o artifactId da v2 do Maven corresponde ao SERVICE\$1ID na maioria dos casos, você tem as informações necessárias para adicionar blocos de dependência ao arquivo POM.

A tabela a seguir mostra como podemos determinar as dependências da v2.


| SERVICE\$1ID da v1 mapeia para...nome do pacote | SERVICE\$1ID da v2 mapeia para...nome do pacote | Dependência da v2 do Maven | 
| --- | --- | --- | 
|  **ec2** `com.amazonaws.services.ec2.*`  |  **ec2** `software.amazon.awssdk.services.ec2.*`  |  <pre><dependency><br />  <groupId>software.amazon.awssdk</groupId><br />  <artifactId>ec2</artifactId><br /></dependency></pre>  | 
|  **escalonamento automático** `com.amazonaws.services.autoscaling.*`  |  **escalonamento automático** `software.amazon.awssdk.services.autoscaling.*`  |  <pre><dependency><br />  <groupId>software.amazon.awssdk</groupId><br />  <artifactId>autoscaling</artifactId><br /></dependency></pre>  | 
| cloudformation`com.amazonaws.services.cloudformation.*` | cloudformation`software.amazon.awssdk.cloudformation.*` |  <pre><dependency><br />  <groupId>software.amazon.awssdk</groupId><br />  <artifactId>cloudformation</artifactId><br /></dependency></pre>  | 
| identitymanagement\$1`com.amazonaws.services.identitymanagement.*` | eu sou\$1`software.amazon.awssdk.iam.*` |  <pre><dependency><br />  <groupId>software.amazon.awssdk</groupId><br />  <artifactId>iam</artifactId><br /></dependency></pre>  | 

\$1 O mapeamento de `identitymanagement` para `iam` é uma exceção em que o SERVICE\$1ID difere entre as versões. Consulte as exceções em [Nome do pacote para mapeamentos de artifactId do Maven.](#migration-serviceid-artifactid-mapping), caso o Maven ou o Gradle não consigam resolver a dependência da v2.

### 4. Adicionar elementos de dependência da v2 ao arquivo POM
<a name="migration-steps-example-step4"></a>

Na etapa 3, determinamos os quatro blocos de dependência que precisam ser adicionados ao arquivo POM. Não precisamos adicionar uma versão porque especificamos o BOM na etapa 1. Depois que as importações são adicionadas, nosso arquivo POM tem os seguintes elementos de dependência.

```
    ...
  <dependencies>
    ...
    <dependency>
      <groupId>software.amazon.awssdk</groupId>
      <artifactId>autoscaling</artifactId>
    </dependency>
    <dependency>
      <groupId>software.amazon.awssdk</groupId>
      <artifactId>iam</artifactId>
    </dependency>
    <dependency>
      <groupId>software.amazon.awssdk</groupId>
      <artifactId>cloudformation</artifactId>
    </dependency>
    <dependency>
      <groupId>software.amazon.awssdk</groupId>
      <artifactId>ec2</artifactId>
    </dependency>
    ...
  </dependencies>
    ...
```

### 5. Nos arquivos Java, altere incrementalmente as classes da v1 para as classes da v2
<a name="migration-steps-example-step5"></a>

No método que estamos migrando, vemos
+ Um cliente de serviço do EC2 de `com.amazonaws.services.ec2.AmazonEC2Client`.
+ Várias classes de modelo do EC2 usadas. Por exemplo, `DescribeInstancesRequest` e `DescribeInstancesResult`.

```
import com.amazonaws.ClientConfiguration;
import com.amazonaws.regions.Region;
import com.amazonaws.regions.RegionUtils;
import com.amazonaws.services.ec2.AmazonEC2Client;
import com.amazonaws.services.ec2.model.AmazonEC2Exception;
import com.amazonaws.services.ec2.model.CreateTagsRequest;
import com.amazonaws.services.ec2.model.DescribeInstancesRequest;
import com.amazonaws.services.ec2.model.DescribeInstancesResult;
import com.amazonaws.services.ec2.model.Instance;
import com.amazonaws.services.ec2.model.InstanceStateName;
import com.amazonaws.services.ec2.model.Reservation;
import com.amazonaws.services.ec2.model.Tag;
import com.amazonaws.services.ec2.model.TerminateInstancesRequest;
...
private static List<Instance> getRunningInstances(AmazonEC2Client ec2, List<String> instanceIds)
    List<Instance> runningInstances = new ArrayList<>();
    try {
        DescribeInstancesRequest request = new DescribeInstancesRequest()
                .withInstanceIds(instanceIds);
        DescribeInstancesResult result;
        do {
            // DescribeInstancesResponse is a paginated response, so use tokens with multiple re
            result = ec2.describeInstances(request);
            request.setNextToken(result.getNextToken());   // Prepare request for next page.
            for (final Reservation r : result.getReservations()) {
                for (final Instance instance : r.getInstances()) {
                    LOGGER.info("Examining instanceId: "+ instance.getInstanceId());
                    // if instance is in a running state, add it to runningInstances list.
                    if (RUNNING_STATES.contains(instance.getState().getName())) {
                        runningInstances.add(instance);
                    }
                }
            }
        } while (result.getNextToken() != null);
    } catch (final AmazonEC2Exception exception) {
        // if instance isn't found, assume its terminated and continue.
        if (exception.getErrorCode().equals(NOT_FOUND_ERROR_CODE)) {
            LOGGER.info("Instance probably terminated; moving on.");
        } else {
            throw exception;
        }
    }
    return runningInstances;
}
...
```

Nosso objetivo é substituir todas as importações da v1 por importações da v2. Prosseguimos com uma classe por vez.

#### a. Substitua a declaração de importação ou o nome da classe
<a name="migration-example-step5-substep1"></a>

Vemos que o primeiro parâmetro do método `describeRunningInstances` uma instância `AmazonEC2Client` da v1. Execute um destes procedimentos:
+ Substitua a importação por `com.amazonaws.services.ec2.AmazonEC2Client` com `software.amazon.awssdk.services.ec2.Ec2Client` e altere `AmazonEC2Client` para `Ec2Client`.
+ Altere o tipo de parâmetro para `Ec2Client` e deixe que o IDE solicite a importação correta. Nosso IDE solicitará a importação da classe da v2 porque os nomes dos clientes são diferente: `AmazonEC2Client` e `Ec2Client`. Essa abordagem não funcionará se o nome da classe for o mesmo nas duas versões.

#### b. Substitua as classes do modelo da v1 por equivalentes da v2
<a name="migration-example-step5-substep2"></a>

Após a mudança para o `Ec2Client` da v2, se usarmos um IDE, veremos erros de compilação na declaração a seguir.

```
                    result = ec2.describeInstances(request);
```

O erro de compilação resulta do uso de uma instância de `DescribeInstancesRequest` da v1 como parâmetro para o método `Ec2Client` `describeInstances` da v2. Para corrigir, faça as seguintes declarações de substituição ou importação.


| subtituir | por | 
| --- | --- | 
|  <pre>import com.amazonaws.services.ec2.model.DescribeInstancesRequest</pre>  |  <pre>import software.amazon.awssdk.services.ec2.model.DescribeInstancesRequest</pre>  | 

#### c. Altere os compiladores da v1 para compiladores da v2.
<a name="migration-example-step5-substep3"></a>

Ainda vemos erros de compilação porque [não há construtores nas classes da v2](migration-whats-different.md#immutable-classes). Para corrigir isso, faça a alteração a seguir.


| alteração | para | 
| --- | --- | 
|  <pre>final DescribeInstancesRequest request = new DescribeInstancesRequest()<br />        .withInstanceIds(instanceIdsCopy);</pre>  |  <pre>final DescribeInstancesRequest request = DescribeInstancesRequest.builder()<br />        .instanceIds(instanceIdsCopy)<br />        .build();</pre>  | 

#### d. Substitua objetos de resposta `*Result` da v1 por `*Response` equivalentes da v2
<a name="migration-example-step5-substep4"></a>

Uma diferença consistente entre a v1 e a v2 é que todos os [objetos de resposta na v2 terminam com `*Response` em vez de `*Result`](migration-whats-different.md#model-classname-changes). Substitua a importação `DescribeInstancesResult` da v1 pela importação `DescribeInstancesResponse` da v2.

#### d. Fazer alterações na API
<a name="migration-example-step5-substep5"></a>

A declaração a seguir precisa de algumas alterações.

```
request.setNextToken(result.getNextToken());
```

Na v2, os [métodos de setter](migration-whats-different.md#setter-getter-methods) não usam o `set` nem com `prefix`. Métodos getter com prefixo `get` também foram incluídos no SDK para Java 2.x

Classes de modelo, como a instância `request`, são imutáveis na v2, então precisamos criar uma `DescribeInstancesRequest` com um compilador.

Na v2, a declaração se torna a seguinte.

```
request = DescribeInstancesRequest.builder()
        .nextToken(result.nextToken())
        .build();
```

#### d. Repita até que o método seja compilado com classes da v2
<a name="migration-example-step5-substep6"></a>

Continue com o restante do código. Substitua as importações da v1 pelas importações da v2 e corrija os erros de compilação. Consulte a [Referência da API da v2](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/ec2/package-summary.html) e a [Referência O que mudou](migration-whats-different.md), conforme necessário.

Depois de migrarmos esse único método, temos o seguinte código da v2.

```
import com.amazonaws.ClientConfiguration;
import com.amazonaws.regions.Region;
import com.amazonaws.regions.RegionUtils;
import com.amazonaws.services.ec2.AmazonEC2Client;
import com.amazonaws.services.ec2.model.AmazonEC2Exception;
import com.amazonaws.services.ec2.model.CreateTagsRequest;
import com.amazonaws.services.ec2.model.InstanceStateName;
import com.amazonaws.services.ec2.model.Tag;
import com.amazonaws.services.ec2.model.TerminateInstancesRequest;

import software.amazon.awssdk.services.ec2.Ec2Client;
import software.amazon.awssdk.services.ec2.model.DescribeInstancesRequest;
import software.amazon.awssdk.services.ec2.model.DescribeInstancesResponse;
import software.amazon.awssdk.services.ec2.model.Ec2Exception;
import software.amazon.awssdk.services.ec2.model.Instance;
import software.amazon.awssdk.services.ec2.model.Reservation;
...
private static List<Instance> getRunningInstances(Ec2Client ec2, List<String> instanceIds) {
    List<Instance> runningInstances = new ArrayList<>();
        try {
            DescribeInstancesRequest request = DescribeInstancesRequest.builder()
                    .instanceIds(instanceIds)
                    .build();
            DescribeInstancesResponse result;
            do {
                // DescribeInstancesResponse is a paginated response, so use tokens with multiple re
                result = ec2.describeInstances(request);
                request = DescribeInstancesRequest.builder()   // Prepare request for next page.
                        .nextToken(result.nextToken())
                        .build();
                for (final Reservation r : result.reservations()) {
                    for (final Instance instance : r.instances()) {
                        // if instance is in a running state, add it to runningInstances list.
                        if (RUNNING_STATES.contains(instance.state().nameAsString())) {
                            runningInstances.add(instance);
                        }
                    }
                }
            } while (result.nextToken() != null);
        } catch (final Ec2Exception exception) {
            // if instance isn't found, assume its terminated and continue.
            if (exception.awsErrorDetails().errorCode().equals(NOT_FOUND_ERROR_CODE)) {
                    LOGGER.info("Instance probably terminated; moving on.");
            } else {
                throw exception;
            }
        }
        return runningInstances;
    }
...
```

Como estamos migrando um único método em um arquivo Java com oito métodos, temos uma combinação de importações da v1 e da v2 à medida que trabalhamos no arquivo. Adicionamos as últimas seis declarações de importação à medida que executamos as etapas. 

Depois de migrarmos todo o código, não haverá mais declarações de importação v1.

### 6. Remova as dependências da v1 do Maven das importações do POM e da v1 dos arquivos
<a name="migration-steps-example-step6"></a>

Depois de migrarmos todo o código da v1 no arquivo, temos as seguintes declarações de importação do SDK da v2.

```
import software.amazon.awssdk.core.client.config.ClientOverrideConfiguration;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.regions.ServiceMetadata;
import software.amazon.awssdk.services.ec2.Ec2Client;
import software.amazon.awssdk.services.ec2.model.CreateTagsRequest;
import software.amazon.awssdk.services.ec2.model.DescribeInstancesRequest;
import software.amazon.awssdk.services.ec2.model.DescribeInstancesResponse;
import software.amazon.awssdk.services.ec2.model.Ec2Exception;
import software.amazon.awssdk.services.ec2.model.Instance;
import software.amazon.awssdk.services.ec2.model.InstanceStateName;
import software.amazon.awssdk.services.ec2.model.Reservation;
import software.amazon.awssdk.services.ec2.model.Tag;
import software.amazon.awssdk.services.ec2.model.TerminateInstancesRequest;
```

Depois de migrarmos *todos* os arquivos na aplicação, não precisaremos mais das dependências da v1 no arquivo POM. Remova o BOM v1 da seção `dependencyManagement`, caso esteja usando, e todos os blocos de dependência da v1.

### 7. Refatorar o código para usar os aprimoramentos da API da v2
<a name="migration-steps-example-step7"></a>

Para o trecho que estamos migrando, podemos usar um paginador da v2 e deixar o SDK gerenciar as solicitações baseadas em tokens para obter mais dados, caso desejarmos.

Podemos substituir toda a cláusula `do` pela seguinte.

```
                DescribeInstancesIterable responses = ec2.describeInstancesPaginator(request);

                responses.reservations().stream()
                        .forEach(reservation -> reservation.instances()
                                .forEach(instance -> {
                                    if (RUNNING_STATES.contains(instance.state().nameAsString())) {
                                        runningInstances.put(instance.instanceId(), instance);
                                    }
                                }));
```

## Nome do pacote para mapeamentos de artifactId do Maven.
<a name="migration-serviceid-artifactid-mapping"></a>

Ao migrar o projeto Maven ou Gradle da v1 do SDK para Java para a v2, você precisa descobrir quais dependências adicionar ao arquivo de compilação. A abordagem descrita em [step-by-stepInstruções de migração com exemplo](#migration-steps) (etapa 3) usa os nomes dos pacotes nas declarações de importação como ponto de partida para determinar as dependências (como artifactIds) que devem ser adicionadas ao arquivo de compilação. 

Você pode usar as informações deste tópico para mapear os nomes dos pacotes da v1 para os artifactIds da v2.

### Convenção de nomenclatura comum usada em nomes de pacotes e artifactIds do Maven
<a name="migration-naming-convention"></a>

A tabela a seguir mostra a convenção de nomenclatura comum SDKs usada para um determinado SERVICE\$1ID. Um SERVICE\$1ID é um identificador exclusivo para um. AWS service (Serviço da AWS) Por exemplo, o SERVICE\$1ID do serviço Amazon S3 é `s3` e o SERVICE\$1ID do Amazon Cognito Identity é `cognitoidentity`.


| Nome do pacote da v1 (declaração de importação) | artifactId da v1 | artifactId da v2 | Nome do pacote da v2 (declaração de importação) | 
| --- | --- | --- | --- | 
| com.amazonaws.services.SERVICE\$1ID | aws-java-sdk-ID DO SERVIÇO | SERVICE\$1ID | software.amazon.awssdk.services.SERVICE\$1ID | 
|   | 
| Exemplo do Amazon Cognito Identity (SERVICE\$1ID: cognitoidentity) | 
| com.amazonaws.services.cognitoidentity | aws-java-sdk- identidade cognitiva | cognitoidentity | software.amazon.awssdk.services.cognitoidentity | 

### Diferenças de SERVICE\$1ID
<a name="migration-serviceid-diffs"></a>

#### Na v1
<a name="migration-serviceid-diffs-withinv1"></a>

Em alguns casos, o SERVICE\$1ID difere entre o nome do pacote e o artifactId do mesmo serviço. Por exemplo, a linha CloudWatch Métricas da tabela a seguir mostra que `metrics` é o SERVICE\$1ID no nome do pacote, mas `cloudwatchmetrics` é o SERVICE\$1ID do ArtifactID.

#### Na v2
<a name="migration-serviceid-diffs-withinv2"></a>

Não há diferenças no SERVICE\$1ID usado em nomes de pacotes e artifactIds.

#### Entre a v1 e a v2
<a name="migration-serviceid-diffs-btwv1v2"></a>

Para a maioria dos serviços, o SERVICE\$1ID na v2 é o mesmo que o SERVICE\$1ID na v1 nos nomes dos pacotes e nos artifactIds. Um exemplo disso é o SERVICE\$1ID `cognitoedentity`, conforme mostrado na tabela anterior. No entanto, alguns SERVICE\$1 IDs diferem entre os, SDKs conforme mostrado na tabela a seguir.

Um **SERVICE\$1ID em negrito** em qualquer uma das colunas da v1 indica que ele é diferente do SERVICE\$1ID usado na v2.


| Nome do serviço | Nome do pacote da v1 | artifactId da v1 | artifactId da v2 | Nome do pacote da v2 | 
| --- | --- | --- | --- | --- | 
|  |  Todos os nomes de pacotes começam com `com.amazonaws.services`, conforme mostrado na primeira linha.  |  Todos os artifactIds são colocados entre tags, conforme mostrado na primeira linha.  |  Todos os artifactIds são colocados entre tags, conforme mostrado na primeira linha.  |  Todos os nomes de pacotes começam com `software.amazon.awssdk`, conforme mostrado na primeira linha.  | 
|  | 
| API Gateway | com.amazonaws.services.apigateway | <artifactId>aws-java-sdk- gateway de API</artifactId> | <artifactId>apigateway</artifactId> | software.amazon.awssdk.services.apigateway | 
| Registro de aplicação | appregistry | appregistry | servicecatalogappregistry | servicecatalogappregistry | 
| Application Discovery | applicationdiscovery | discovery | applicationdiscovery | applicationdiscovery | 
| Runtime do Augmented AI | augmentedairuntime | augmentedairuntime | sagemakera2iruntime | sagemakera2iruntime | 
| Certificate Manager | certificatemanager | acm | acm | acm | 
| CloudControl API | cloudcontrolapi | cloudcontrolapi | cloudcontrol | cloudcontrol | 
| CloudSearch | cloudsearchv2 | cloudsearch | cloudsearch | cloudsearch | 
| CloudSearch Domínio | cloudsearchdomain | pesquisa na nuvem | cloudsearchdomain | cloudsearchdomain | 
| CloudWatch Eventos | cloudwatchevents | eventos | cloudwatchevents | cloudwatchevents | 
| CloudWatch Evidentemente | cloudwatchevidently | cloudwatchevidently | evidently | evidently | 
| CloudWatch Registros | logs | logs | cloudwatchlogs | cloudwatchlogs | 
| CloudWatch Métricas | métricas | cloudwatchmetrics | cloudwatch | cloudwatch | 
| CloudWatch Rum | cloudwatchrum | cloudwatchrum | rum | rum | 
| Provedor de identidades do Cognito | cognitoidp | cognitoidp | cognitoidentityprovider | cognitoidentityprovider | 
| Campanhas do Connect | connectcampaign | connectcampaign | connectcampaigns | connectcampaigns | 
| Connect Wisdom | connectwisdom | connectwisdom | wisdom | wisdom | 
| Database Migration Service | databasemigrationservice | dms | databasemigration | databasemigration | 
| DataZone | datazone | datazoneexternal | datazone | datazone | 
| DynamoDB | dynamodbv2 | dynamodb | dynamodb | dynamodb | 
| Elastic File System | sistema de arquivos elástico | efs | efs | efs | 
| Elastic Map Reduce | elasticmapreduce | emr | emr | emr | 
| Glue DataBrew | gluedatabrew | gluedatabrew | databrew | databrew | 
| IAM Roles Anywhere | iamrolesanywhere | iamrolesanywhere | rolesanywhere | rolesanywhere | 
| Gerenciamento de identidades | identitymanagement | iam | iam | iam | 
| Dados de IoT | iotdata | iot | iotdataplane | iotdataplane | 
| Kinesis Analytics | kinesisanalytics | kinesis | kinesisanalytics | kinesisanalytics | 
| Kinesis Firehose | kinesisfirehose | kinesis | firehose | firehose | 
| Canais de sinalização do Kinesis Video | kinesisvideosignalingchannels | kinesisvideosignalingchannels | kinesisvideosignaling | kinesisvideosignaling | 
| Lex | lexruntime | lex | lexruntime | lexruntime | 
| Lookout for Vision | lookoutforvision | lookoutforvision | lookoutvision | lookoutvision | 
| Mainframe Modernization | mainframemodernization | mainframemodernization | m2 | m2 | 
| Marketplace Metering | marketplacemetering | marketplacemeteringservice | marketplacemetering | marketplacemetering | 
| Managed Grafana | managedgrafana | managedgrafana | grafana | grafana | 
| Mechanical Turk | mturk | mechanicalturkrequester | mturk | mturk | 
| Migration Hub Strategy Recommendations | migrationhubstrategyrecommendations | migrationhubstrategyrecommendations | migrationhubstrategy | migrationhubstrategy | 
| Nimble Studio | nimblestudio | nimblestudio | nimble | nimble | 
| 5G Privado | private5g | private5g | privatenetworks | privatenetworks | 
| Prometheus | prometheus | prometheus | amp | amp | 
| Lixeira | recyclebin | recyclebin | rbin | rbin | 
| API de dados Redshift | redshiftdataapi | redshiftdataapi | redshiftdata | redshiftdata | 
| Route 53 | route53domains | route53 | route53domains | route53domains | 
| SageMaker Edge Manager | sagemakeredgemanager | sagemakeredgemanager | sagemakeredge | sagemakeredge | 
| Security Token | securitytoken | sts | sts | sts | 
| Server Migration | servermigration | servermigration | sms | sms | 
| Simple Email | simpleemail | ses | ses | ses | 
| Simple Email V2 | simpleemailv2 | sesv2 | sesv2 | sesv2 | 
| Simple Systems Manager | simplesystemsmanagement | ssm | ssm | ssm | 
| Simple Workflow | simpleworkflow | simpleworkflow | swf | swf | 
| Step Functions | stepfunctions | stepfunctions | sfn | sfn | 

# O que há de diferente entre AWS SDK para Java 1.x e 2.x
<a name="migration-whats-different"></a>

Esta seção descreve as principais mudanças a serem observadas ao converter um aplicativo do uso da AWS SDK para Java versão 1.x para a versão 2.x.

## Alteração do nome do pacote
<a name="mig-diff-package-name-change"></a>

Uma alteração notável do SDK para Java 1.x para o SDK para Java 2.x é a alteração do nome do pacote. Os nomes dos pacotes começam com `software.amazon.awssdk` no SDK 2.x, enquanto o SDK 1.x usa `com.amazonaws`.

Esses mesmos nomes diferenciam os artefatos do Maven do SDK 1.x para o SDK 2.x. Os artefatos do Maven para o SDK 2.x usam o groupld `software.amazon.awssdk`, enquanto o SDK 1.x usa o groupld `com.amazonaws`.

Algumas vezes, seu código exige uma dependência de `com.amazonaws` para um projeto que, de outra forma, usa somente artefatos do SDK 2.x. Um exemplo disso é quando você trabalha com o AWS Lambda do lado do servidor. Isso foi mostrado na seção [Configurar um projeto do Apache Maven](setup-project-maven.md#modules-dependencies), anteriormente neste guia.

**nota**  
Vários nomes de pacotes no SDK 1.x contêm a `v2`. O uso da `v2` nesse caso geralmente significa que o código no pacote é direcionado para funcionar com a versão 2 do serviço.   
Como o nome completo do pacote começa com `com.amazonaws`, esses são componentes do SDK 1.x. Exemplos desses nomes de pacotes no SDK 1.x:   
`com.amazonaws.services.dynamodbv2`
`com.amazonaws.retry.v2`
`com.amazonaws.services.apigatewayv2`
`com.amazonaws.services.simpleemailv2`

## Adicionar a versão 2.x ao seu projeto
<a name="adding-v2"></a>

O Maven é a forma recomendada de gerenciar dependências ao usar o AWS SDK para Java 2.x. Para adicionar os componentes da versão 2.x ao projeto, basta atualizar o arquivo `pom.xml` com uma dependência no SDK. 

**Example**  

```
<dependencyManagement>
    <dependencies>
        <dependency>
          <groupId>software.amazon.awssdk</groupId>
          <artifactId>bom</artifactId>
          <version>2.27.21</version>
          <type>pom</type>
          <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<dependencies>
    <dependency>
      <groupId>software.amazon.awssdk</groupId>
      <artifactId>dynamodb</artifactId>
    </dependency>
</dependencies>
```

Você também pode [usar as versões 1.x e 2.x side-by-side](migration-side-by-side.md) ao migrar seu projeto para a versão 2.x.

## Imutável POJOs
<a name="immutable-classes"></a>

Os clientes e solicitação de operação e objetos de resposta agora são imutáveis e não podem ser alterados após a criação. Para reutilizar uma variável de solicitação ou resposta, você deve criar um novo objeto para atribuir a ela.

**Example de atualizar um objeto de solicitação na 1.x**  

```
DescribeAlarmsRequest request = new DescribeAlarmsRequest();
DescribeAlarmsResult response = cw.describeAlarms(request);

request.setNextToken(response.getNextToken());
```

**Example de atualizar um objeto de solicitação em 2.x**  

```
DescribeAlarmsRequest request = DescribeAlarmsRequest.builder().build();
DescribeAlarmsResponse response = cw.describeAlarms(request);

request = DescribeAlarmsRequest.builder()
        .nextToken(response.nextToken())
        .build();
```

## Métodos setter e getter
<a name="setter-getter-methods"></a>

No AWS SDK para Java 2.x, os nomes dos métodos setter não incluem o prefixo `set` or`with`. Por exemplo, `*.withEndpoint()` é `*.endpoint()` agora.

Os nomes dos métodos getter não usam o prefixo `get`.

**Example de usar métodos setter na 1.x**  

```
AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard()
        		.withRegion("us-east-1")
        		.build();
```

**Example de usar métodos setter na 2.x**  

```
DynamoDbClient client = DynamoDbClient.builder()
        		.region(Region.US_EAST_1)
        		.build();
```

**Example de usar métodos getter na 1.x**  

```
String token = request.getNextToken();
```

**Example de usar métodos getter na 2.x**  

```
String token = request.nextToken();
```

## Nomes da classe do modelo
<a name="model-classname-changes"></a>

Os nomes das classes de modelo que representam as respostas do serviço terminam com `Response` na v2, em vez de `Result`, que a v1 usa.

**Example de nomes de classes que representam uma resposta na v1**  

```
CreateApiKeyResult
AllocateAddressResult
```

**Example de nomes de classes que representam uma resposta na v2**  

```
CreateApiKeyResponse
AllocateAddressResponse
```

## Status da migração de bibliotecas e utilitários
<a name="migration-libraries-utilities"></a>

### Bibliotecas e utilitários do SDK para Java
<a name="migration-java-sdk-libs-utils"></a>

A tabela a seguir lista o status da migração de bibliotecas e utilitários do SDK para Java. 


| Nome da versão 1.12.x | Nome da versão 2.x | Desde a versão em 2.x | 
| --- | --- | --- | 
| Dínamo DBMapper | [DynamoDbEnhancedClient](dynamodb-enhanced-client.md) | 2.12.0 | 
| Waiters | [Waiters](waiters.md) | 2.15.0 | 
| CloudFrontUrlSigner, CloudFrontCookieSigner | [CloudFrontUtilities](https://aws.amazon.com/blogs/developer/amazon-cloudfront-signed-urls-and-cookies-are-now-supported-in-aws-sdk-for-java-2-x/) | 2.18.33 | 
| TransferManager | [S3TransferManager](transfer-manager.md) | 2.19.0 | 
| Cliente de metadados do EC2 |  [Cliente de metadados do EC2](examples-ec2-IMDS.md)  | 2.19.29 | 
| Analisador de URI do S3 |  [Analisador de URI do S3](https://aws.amazon.com/blogs/devops/s3-uri-parsing-is-now-available-in-aws-sdk-for-java-2-x/)  | 2.20.41 | 
| Criador de política do IAM | [Criador de política do IAM](feature-iam-policy-builder.md) | 2.20.126 | 
| Notificações de eventos do S3 | [Notificações de eventos do S3](examples-s3-event-notifications.md#s3-event-notification-read) | 2.25.11  | 
| Buffer do lado do cliente do Amazon SQS | [API de agrupamento em lote de automático de solicitações para Amazon SQS](sqs-auto-batch.md) | 2.28.0 | 
| Listeners de progresso | Listeners de progresso | [ainda não lançado](https://github.com/aws/aws-sdk-java-v2/issues/25) | 

### Bibliotecas relacionadas
<a name="migration-other-sdks"></a>

A tabela a seguir lista as bibliotecas lançadas separadamente, mas que funcionam com o SDK para Java 2.x.


| Nome usado com a versão 2.x do SDK para Java | Desde a versão | 
| --- | --- | 
|  [Cliente de criptografia do Amazon S3](https://docs.aws.amazon.com/amazon-s3-encryption-client/latest/developerguide/what-is-s3-encryption-client.html)  |  3.0.0 1  | 
| [AWS SDK de criptografia de banco de dados para DynamoDB](https://docs.aws.amazon.com/database-encryption-sdk/latest/devguide/ddb-java.html) | 3.0.0 2 | 

#### 1Cliente de criptografia do Amazon S3
<a name="migration-s3-encryption-sdk"></a>

O cliente de criptografia para o Amazon S3 está disponível usando a dependência do Maven a seguir.

```
<dependency>
    <groupId>software.amazon.encryption.s3</groupId>
    <artifactId>amazon-s3-encryption-client-java</artifactId>
    <version>3.x</version>
</dependency>
```

#### 2 SDK AWS de criptografia de banco de dados para DynamoDB
<a name="migration-ddb-encryption-sdk"></a>

O SDK AWS de criptografia de banco de dados para DynamoDB está disponível para V2 usando a seguinte dependência do Maven.

```
<dependency> 
    <groupId>software.amazon.cryptography</groupId>
    <artifactId>aws-database-encryption-sdk-dynamodb</artifactId>
    <version>3.x</version>
</dependency>
```

As informações sobre a biblioteca de criptografia do DynamoDB que funciona com a versão 1 do Java SDK estão disponíveis no [AWS Guia do desenvolvedor do Database Encryption SDK (chamado Amazon *DynamoDB* Encryption](https://docs.aws.amazon.com/database-encryption-sdk/latest/devguide/java.html) Client for Java) e em. [GitHub](https://github.com/aws/aws-dynamodb-encryption-java)

[Para obter mais informações sobre a biblioteca de criptografia do DynamoDB que é compatível com a versão 2 do Java SDK, consulte o Guia do desenvolvedor do SDK de [criptografia de banco de dados e AWS a](https://docs.aws.amazon.com/database-encryption-sdk/latest/devguide/ddb-java.html) fonte. GitHub](https://github.com/aws/aws-database-encryption-sdk-dynamodb)

As informações de migração sobre a biblioteca de criptografia estão disponíveis no [Guia do desenvolvedor do SDK de criptografia de banco de dados da AWS](https://docs.aws.amazon.com/database-encryption-sdk/latest/devguide/ddb-java-migrate.html).

### Detalhes da migração para bibliotecas e utilitários
<a name="migrate-libs-utils-details"></a>
+ [Gerenciador de Transferências](migration-s3-transfer-manager.md)
+ [Utilitário de metadados do EC2](migration-imds.md)
+ [CloudFrontpré-assinando](migration-cloudfront-presigning.md)
+ [Análise de URI do S3](migration-s3-uri-parser.md)
+ [DynamoDB mapping/document APIs](migration-ddb-mapper.md) 
+ [Criador de política do IAM](migration-iam-policy-builder.md)
+ [Notificações de eventos do S3](migration-s3-event-notification.md)
+ Publicação de métricas do SDK ([documentação da 1.x](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/generating-sdk-metrics.html), [documentação da 2.x](metrics.md))

# Alterações de cliente
<a name="migration-clients"></a>

## Builders do cliente
<a name="client-builder"></a>

Você deve criar todos os clientes usando o método do compilador de clientes. Construtores não estão mais disponíveis.

**Example de criar um cliente na versão 1.x**  

```
AmazonDynamoDB ddbClient = AmazonDynamoDBClientBuilder.defaultClient();
AmazonDynamoDBClient ddbClient = new AmazonDynamoDBClient();
```

**Example de criar um cliente na versão 2.x**  

```
DynamoDbClient ddbClient = DynamoDbClient.create();
DynamoDbClient ddbClient = DynamoDbClient.builder().build();
```

## Nomes de classe de cliente
<a name="class-names"></a>

Todos os nomes de classe de cliente agora são totalmente concatenados e não são mais armazenados com o prefixo `Amazon`. Estas alterações estão alinhadas com os nomes usados no AWS CLI.

**Example dos nomes de classe na 1.x**  

```
AmazonDynamoDB
AWSACMPCAAsyncClient
```

**Example dos nomes de classe na 2.x**  

```
DynamoDbClient
AcmAsyncClient
```


**Alterações nos nomes de classe de cliente**  

| Cliente 1.x | Cliente 2.x | 
| --- | --- | 
| com.amazonaws.services.acmpca.AWSACMPCAAsyncClient | software.amazon.awssdk.services.acm.AcmAsyncClient | 
| com.amazonaws.services.acmpca.AWSACMPCAClient | software.amazon.awssdk.services.acm.AcmClient | 
| com.amazonaws.services.alexaforbusiness.AmazonAlexaForBusinessAsyncClient | software.amazon.awssdk.services.alexaforbusiness.AlexaForBusinessAsyncClient | 
| com.amazonaws.services.alexaforbusiness.AmazonAlexaForBusinessClient | software.amazon.awssdk.services.alexaforbusiness.AlexaForBusinessClient | 
| com.amazonaws.services.apigateway.AmazonApiGatewayAsyncClient | software.amazon.awssdk.services.apigateway.ApiGatewayAsyncClient | 
| com.amazonaws.services.apigateway.AmazonApiGatewayClient | software.amazon.awssdk.services.apigateway.ApiGatewayClient | 
| com.amazonaws.services.applicationautoscaling.AWSApplicationAutoScalingAsyncClient | software.amazon.awssdk.services.applicationautoscaling.ApplicationAutoScalingAsyncClient | 
| com.amazonaws.services.applicationautoscaling.AWSApplicationAutoScalingClient | software.amazon.awssdk.services.applicationautoscaling.ApplicationAutoScalingClient | 
| com.amazonaws.services.applicationdiscovery.AWSApplicationDiscoveryAsyncClient | software.amazon.awssdk.services.applicationdiscovery.ApplicationDiscoveryAsyncClient | 
| com.amazonaws.services.applicationdiscovery.AWSApplicationDiscoveryClient | software.amazon.awssdk.services.applicationdiscovery.ApplicationDiscoveryClient | 
| com.amazonaws.services.appstream.AmazonAppStreamAsyncClient | software.amazon.awssdk.services.appstream.AppStreamAsyncClient | 
| com.amazonaws.services.appstream.AmazonAppStreamClient | software.amazon.awssdk.services.appstream.AppStreamClient | 
| com.amazonaws.services.appsync.AWSAppSyncAsyncClient | software.amazon.awssdk.services.appsync.AppSyncAsyncClient | 
| com.amazonaws.services.appsync.AWSAppSyncClient | software.amazon.awssdk.services.appsync.AppSyncClient | 
| com.amazonaws.services.athena.AmazonAthenaAsyncClient | software.amazon.awssdk.services.athena.AthenaAsyncClient | 
| com.amazonaws.services.athena.AmazonAthenaClient | software.amazon.awssdk.services.athena.AthenaClient | 
| com.amazonaws.services.autoscaling.AmazonAutoScalingAsyncClient | software.amazon.awssdk.services.autoscaling.AutoScalingAsyncClient | 
| com.amazonaws.services.autoscaling.AmazonAutoScalingClient | software.amazon.awssdk.services.autoscaling.AutoScalingClient | 
| com.amazonaws.services.autoscalingplans.AWSAutoScalingPlansAsyncClient | software.amazon.awssdk.services.autoscalingplans.AutoScalingPlansAsyncClient | 
| com.amazonaws.services.autoscalingplans.AWSAutoScalingPlansClient | software.amazon.awssdk.services.autoscalingplans.AutoScalingPlansClient | 
| com.amazonaws.services.batch.AWSBatchAsyncClient | software.amazon.awssdk.services.batch.BatchAsyncClient | 
| com.amazonaws.services.batch.AWSBatchClient | software.amazon.awssdk.services.batch.BatchClient | 
| com.amazonaws.services.budgets.AWSBudgetsAsyncClient | software.amazon.awssdk.services.budgets.BudgetsAsyncClient | 
| com.amazonaws.services.budgets.AWSBudgetsClient | software.amazon.awssdk.services.budgets.BudgetsClient | 
| com.amazonaws.services.certificatemanager.AWSCertificateManagerAsyncClient | software.amazon.awssdk.services.acm.AcmAsyncClient | 
| com.amazonaws.services.certificatemanager.AWSCertificateManagerClient | software.amazon.awssdk.services.acm.AcmClient | 
| com.amazonaws.services.cloud9.AWSCloud9AsyncClient | software.amazon.awssdk.services.cloud9.Cloud9AsyncClient | 
| com.amazonaws.services.cloud9.AWSCloud9Client | software.amazon.awssdk.services.cloud9.Cloud9Client | 
| com.amazonaws.services.clouddirectory.AmazonCloudDirectoryAsyncClient | software.amazon.awssdk.services.clouddirectory.CloudDirectoryAsyncClient | 
| com.amazonaws.services.clouddirectory.AmazonCloudDirectoryClient | software.amazon.awssdk.services.clouddirectory.CloudDirectoryClient | 
| com.amazonaws.services.cloudformation.AmazonCloudFormationAsyncClient | software.amazon.awssdk.services.cloudformation.CloudFormationAsyncClient | 
| com.amazonaws.services.cloudformation.AmazonCloudFormationClient | software.amazon.awssdk.services.cloudformation.CloudFormationClient | 
| com.amazonaws.services.cloudfront.AmazonCloudFrontAsyncClient | software.amazon.awssdk.services.cloudfront.CloudFrontAsyncClient | 
| com.amazonaws.services.cloudfront.AmazonCloudFrontClient | software.amazon.awssdk.services.cloudfront.CloudFrontClient | 
| com.amazonaws.services.cloudhsm.AWSCloudHSMAsyncClient | software.amazon.awssdk.services.cloudhsm.CloudHsmAsyncClient | 
| com.amazonaws.services.cloudhsm.AWSCloudHSMClient | software.amazon.awssdk.services.cloudhsm.CloudHsmClient | 
| com.amazonaws.services.cloudhsmv2.AWSCloudHSMV2AsyncClient | software.amazon.awssdk.services.cloudhsmv2.CloudHsmV2AsyncClient | 
| com.amazonaws.services.cloudhsmv2.AWSCloudHSMV2Client | software.amazon.awssdk.services.cloudhsmv2.CloudHsmV2Client | 
| com.amazonaws.services.cloudsearchdomain.AmazonCloudSearchDomainAsyncClient | software.amazon.awssdk.services.cloudsearchdomain.CloudSearchDomainAsyncClient | 
| com.amazonaws.services.cloudsearchdomain.AmazonCloudSearchDomainClient | software.amazon.awssdk.services.cloudsearchdomain.CloudSearchDomainClient | 
| com.amazonaws.services.cloudsearchv2.AmazonCloudSearchAsyncClient | software.amazon.awssdk.services.cloudsearch.CloudSearchAsyncClient | 
| com.amazonaws.services.cloudsearchv2.AmazonCloudSearchClient | software.amazon.awssdk.services.cloudsearch.CloudSearchClient | 
| com.amazonaws.services.cloudtrail.AWSCloudTrailAsyncClient | software.amazon.awssdk.services.cloudtrail.CloudTrailAsyncClient | 
| com.amazonaws.services.cloudtrail.AWSCloudTrailClient | software.amazon.awssdk.services.cloudtrail.CloudTrailClient | 
| com.amazonaws.services.cloudwatch.AmazonCloudWatchAsyncClient | software.amazon.awssdk.services.cloudwatch.CloudWatchAsyncClient | 
| com.amazonaws.services.cloudwatch.AmazonCloudWatchClient | software.amazon.awssdk.services.cloudwatch.CloudWatchClient | 
| com.amazonaws.services.cloudwatchevents.AmazonCloudWatchEventsAsyncClient | software.amazon.awssdk.services.cloudwatchevents.CloudWatchEventsAsyncClient | 
| com.amazonaws.services.cloudwatchevents.AmazonCloudWatchEventsClient | software.amazon.awssdk.services.cloudwatchevents.CloudWatchEventsClient | 
| com.amazonaws.services.codebuild.AWSCodeBuildAsyncClient | software.amazon.awssdk.services.codebuild.CodeBuildAsyncClient | 
| com.amazonaws.services.codebuild.AWSCodeBuildClient | software.amazon.awssdk.services.codebuild.CodeBuildClient | 
| com.amazonaws.services.codecommit.AWSCodeCommitAsyncClient | software.amazon.awssdk.services.codecommit.CodeCommitAsyncClient | 
| com.amazonaws.services.codecommit.AWSCodeCommitClient | software.amazon.awssdk.services.codecommit.CodeCommitClient | 
| com.amazonaws.services.codedeploy.AmazonCodeDeployAsyncClient | software.amazon.awssdk.services.codedeploy.CodeDeployAsyncClient | 
| com.amazonaws.services.codedeploy.AmazonCodeDeployClient | software.amazon.awssdk.services.codedeploy.CodeDeployClient | 
| com.amazonaws.services.codepipeline.AWSCodePipelineAsyncClient | software.amazon.awssdk.services.codepipeline.CodePipelineAsyncClient | 
| com.amazonaws.services.codepipeline.AWSCodePipelineClient | software.amazon.awssdk.services.codepipeline.CodePipelineClient | 
| com.amazonaws.services.codestar.AWSCodeStarAsyncClient | software.amazon.awssdk.services.codestar.CodeStarAsyncClient | 
| com.amazonaws.services.codestar.AWSCodeStarClient | software.amazon.awssdk.services.codestar.CodeStarClient | 
| com.amazonaws.services.cognitoidentity.AmazonCognitoIdentityAsyncClient | software.amazon.awssdk.services.cognitoidentity.CognitoIdentityAsyncClient | 
| com.amazonaws.services.cognitoidentity.AmazonCognitoIdentityClient | software.amazon.awssdk.services.cognitoidentity.CognitoIdentityClient | 
| com.amazonaws.services.cognitoidp.AWSCognitoIdentityProviderAsyncClient | software.amazon.awssdk.services.cognitoidentityprovider.CognitoIdentityProviderAsyncClient | 
| com.amazonaws.services.cognitoidp.AWSCognitoIdentityProviderClient | software.amazon.awssdk.services.cognitoidentityprovider.CognitoIdentityProviderClient | 
| com.amazonaws.services.cognitosync.AmazonCognitoSyncAsyncClient | software.amazon.awssdk.services.cognitosync.CognitoSyncAsyncClient | 
| com.amazonaws.services.cognitosync.AmazonCognitoSyncClient | software.amazon.awssdk.services.cognitosync.CognitoSyncClient | 
| com.amazonaws.services.comprehend.AmazonComprehendAsyncClient | software.amazon.awssdk.services.comprehend.ComprehendAsyncClient | 
| com.amazonaws.services.comprehend.AmazonComprehendClient | software.amazon.awssdk.services.comprehend.ComprehendClient | 
| com.amazonaws.services.config.AmazonConfigAsyncClient | software.amazon.awssdk.services.config.ConfigAsyncClient | 
| com.amazonaws.services.config.AmazonConfigClient | software.amazon.awssdk.services.config.ConfigClient | 
| com.amazonaws.services.connect.AmazonConnectAsyncClient | software.amazon.awssdk.services.connect.ConnectAsyncClient | 
| com.amazonaws.services.connect.AmazonConnectClient | software.amazon.awssdk.services.connect.ConnectClient | 
| com.amazonaws.services.costandusagereport.AWSCostAndUsageReportAsyncClient | software.amazon.awssdk.services.costandusagereport.CostAndUsageReportAsyncClient | 
| com.amazonaws.services.costandusagereport.AWSCostAndUsageReportClient | software.amazon.awssdk.services.costandusagereport.CostAndUsageReportClient | 
| com.amazonaws.services.costexplorer.AWSCostExplorerAsyncClient | software.amazon.awssdk.services.costexplorer.CostExplorerAsyncClient | 
| com.amazonaws.services.costexplorer.AWSCostExplorerClient | software.amazon.awssdk.services.costexplorer.CostExplorerClient | 
| com.amazonaws.services.databasemigrationservice.AWSDatabaseMigrationServiceAsyncClient | software.amazon.awssdk.services.databasemigration.DatabaseMigrationAsyncClient | 
| com.amazonaws.services.databasemigrationservice.AWSDatabaseMigrationServiceClient | software.amazon.awssdk.services.databasemigration.DatabaseMigrationClient | 
| com.amazonaws.services.datapipeline.DataPipelineAsyncClient | software.amazon.awssdk.services.datapipeline.DataPipelineAsyncClient | 
| com.amazonaws.services.datapipeline.DataPipelineClient | software.amazon.awssdk.services.datapipeline.DataPipelineAsyncClient | 
| com.amazonaws.services.dax.AmazonDaxAsyncClient | software.amazon.awssdk.services.dax.DaxAsyncClient | 
| com.amazonaws.services.dax.AmazonDaxClient | software.amazon.awssdk.services.dax.DaxClient | 
| com.amazonaws.services.devicefarm.AWSDeviceFarmAsyncClient | software.amazon.awssdk.services.devicefarm.DeviceFarmAsyncClient | 
| com.amazonaws.services.devicefarm.AWSDeviceFarmClient | software.amazon.awssdk.services.devicefarm.DeviceFarmClient | 
| com.amazonaws.services.directconnect.AmazonDirectConnectAsyncClient | software.amazon.awssdk.services.directconnect.DirectConnectAsyncClient | 
| com.amazonaws.services.directconnect.AmazonDirectConnectClient | software.amazon.awssdk.services.directconnect.DirectConnectClient | 
| com.amazonaws.services.directory.AWSDirectoryServiceAsyncClient | software.amazon.awssdk.services.directory.DirectoryAsyncClient | 
| com.amazonaws.services.directory.AWSDirectoryServiceClient | software.amazon.awssdk.services.directory.DirectoryClient | 
| com.amazonaws.services.dlm.AmazonDLMAsyncClient | software.amazon.awssdk.services.dlm.DlmAsyncClient | 
| com.amazonaws.services.dlm.AmazonDLMClient | software.amazon.awssdk.services.dlm.DlmClient | 
| com.amazonaws.services.dynamodbv2.AmazonDynamoDBAsyncClient | software.amazon.awssdk.services.dynamodb.DynamoDbAsyncClient | 
| com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient | software.amazon.awssdk.services.dynamodb.DynamoDbClient | 
| com.amazonaws.services.dynamodbv2.AmazonDynamoDBStreamsAsyncClient | software.amazon.awssdk.services.dynamodb.streams.DynamoDbStreamsAsyncClient | 
| com.amazonaws.services.dynamodbv2.AmazonDynamoDBStreamsClient | software.amazon.awssdk.services.dynamodb.streams.DynamoDbStreamsClient | 
| com.amazonaws.services.ec2.AmazonEC2AsyncClient | software.amazon.awssdk.services.ec2.Ec2AsyncClient | 
| com.amazonaws.services.ec2.AmazonEC2Client | software.amazon.awssdk.services.ec2.Ec2Client | 
| com.amazonaws.services.ecr.AmazonECRAsyncClient | software.amazon.awssdk.services.ecr.EcrAsyncClient | 
| com.amazonaws.services.ecr.AmazonECRClient | software.amazon.awssdk.services.ecr.EcrClient | 
| com.amazonaws.services.ecs.AmazonECSAsyncClient | software.amazon.awssdk.services.ecs.EcsAsyncClient | 
| com.amazonaws.services.ecs.AmazonECSClient | software.amazon.awssdk.services.ecs.EcsClient | 
| com.amazonaws.services.eks.AmazonEKSAsyncClient | software.amazon.awssdk.services.eks.EksAsyncClient | 
| com.amazonaws.services.eks.AmazonEKSClient | software.amazon.awssdk.services.eks.EksClient | 
| com.amazonaws.services.elasticache.AmazonElastiCacheAsyncClient | software.amazon.awssdk.services.elasticache.ElastiCacheAsyncClient | 
| com.amazonaws.services.elasticache.AmazonElastiCacheClient | software.amazon.awssdk.services.elasticache.ElastiCacheClient | 
| com.amazonaws.services.elasticbeanstalk.AWSElasticBeanstalkAsyncClient | software.amazon.awssdk.services.elasticbeanstalk.ElasticBeanstalkAsyncClient | 
| com.amazonaws.services.elasticbeanstalk.AWSElasticBeanstalkClient | software.amazon.awssdk.services.elasticbeanstalk.ElasticBeanstalkClient | 
| com.amazonaws.services.elasticfilesystem.AmazonElasticFileSystemAsyncClient | software.amazon.awssdk.services.efs.EfsAsyncClient | 
| com.amazonaws.services.elasticfilesystem.AmazonElasticFileSystemClient | software.amazon.awssdk.services.efs.EfsClient | 
| com.amazonaws.services.elasticloadbalancing.AmazonElasticLoadBalancingAsyncClient | software.amazon.awssdk.services.elasticloadbalancing.ElasticLoadBalancingAsyncClient | 
| com.amazonaws.services.elasticloadbalancing.AmazonElasticLoadBalancingClient | software.amazon.awssdk.services.elasticloadbalancing.ElasticLoadBalancingClient | 
| com.amazonaws.services.elasticloadbalancingv2.AmazonElasticLoadBalancingAsyncClient | software.amazon.awssdk.services.elasticloadbalancingv2.ElasticLoadBalancingV2AsyncClient | 
| com.amazonaws.services.elasticloadbalancingv2.AmazonElasticLoadBalancingClient | software.amazon.awssdk.services.elasticloadbalancingv2.ElasticLoadBalancingV2Client | 
| com.amazonaws.services.elasticmapreduce.AmazonElasticMapReduceAsyncClient | software.amazon.awssdk.services.emr.EmrAsyncClient | 
| com.amazonaws.services.elasticmapreduce.AmazonElasticMapReduceClient | software.amazon.awssdk.services.emr.EmrClient | 
| com.amazonaws.services.elasticsearch.AWSElasticsearchAsyncClient | software.amazon.awssdk.services.elasticsearch.ElasticsearchAsyncClient | 
| com.amazonaws.services.elasticsearch.AWSElasticsearchClient | software.amazon.awssdk.services.elasticsearch.ElasticsearchClient | 
| com.amazonaws.services.elastictranscoder.AmazonElasticTranscoderAsyncClient | software.amazon.awssdk.services.elastictranscoder.ElasticTranscoderAsyncClient | 
| com.amazonaws.services.elastictranscoder.AmazonElasticTranscoderClient | software.amazon.awssdk.services.elastictranscoder.ElasticTranscoderClient | 
| com.amazonaws.services.fms.AWSFMSAsyncClient | software.amazon.awssdk.services.fms.FmsAsyncClient | 
| com.amazonaws.services.fms.AWSFMSClient | software.amazon.awssdk.services.fms.FmsClient | 
| com.amazonaws.services.gamelift.AmazonGameLiftAsyncClient | software.amazon.awssdk.services.gamelift.GameLiftAsyncClient | 
| com.amazonaws.services.gamelift.AmazonGameLiftClient | software.amazon.awssdk.services.gamelift.GameLiftClient | 
| com.amazonaws.services.glacier.AmazonGlacierAsyncClient | software.amazon.awssdk.services.glacier.GlacierAsyncClient | 
| com.amazonaws.services.glacier.AmazonGlacierClient | software.amazon.awssdk.services.glacier.GlacierClient | 
| com.amazonaws.services.glue.AWSGlueAsyncClient | software.amazon.awssdk.services.glue.GlueAsyncClient | 
| com.amazonaws.services.glue.AWSGlueClient | software.amazon.awssdk.services.glue.GlueClient | 
| com.amazonaws.services.greengrass.AWSGreengrassAsyncClient | software.amazon.awssdk.services.greengrass.GreengrassAsyncClient | 
| com.amazonaws.services.greengrass.AWSGreengrassClient | software.amazon.awssdk.services.greengrass.GreengrassClient | 
| com.amazonaws.services.guardduty.AmazonGuardDutyAsyncClient | software.amazon.awssdk.services.guardduty.GuardDutyAsyncClient | 
| com.amazonaws.services.guardduty.AmazonGuardDutyClient | software.amazon.awssdk.services.guardduty.GuardDutyClient | 
| com.amazonaws.services.health.AWSHealthAsyncClient | software.amazon.awssdk.services.health.HealthAsyncClient | 
| com.amazonaws.services.health.AWSHealthClient | software.amazon.awssdk.services.health.HealthClient | 
| com.amazonaws.services.identitymanagement.AmazonIdentityManagementAsyncClient | software.amazon.awssdk.services.iam.IamAsyncClient | 
| com.amazonaws.services.identitymanagement.AmazonIdentityManagementClient | software.amazon.awssdk.services.iam.IamClient | 
| com.amazonaws.services.importexport.AmazonImportExportAsyncClient | Deprecated | 
| com.amazonaws.services.importexport.AmazonImportExportClient | Deprecated | 
| com.amazonaws.services.inspector.AmazonInspectorAsyncClient | software.amazon.awssdk.services.inspector.InspectorAsyncClient | 
| com.amazonaws.services.inspector.AmazonInspectorClient | software.amazon.awssdk.services.inspector.InspectorClient | 
| com.amazonaws.services.iot.AWSIotAsyncClient | software.amazon.awssdk.services.iot.IotAsyncClient | 
| com.amazonaws.services.iot.AWSIotClient | software.amazon.awssdk.services.iot.IotClient | 
| com.amazonaws.services.iot1clickdevices.AWSIoT1ClickDevicesAsyncClient | software.amazon.awssdk.services.iot1clickdevices.Iot1ClickDevicesAsyncClient | 
| com.amazonaws.services.iot1clickdevices.AWSIoT1ClickDevicesClient | software.amazon.awssdk.services.iot1clickdevices.Iot1ClickDevicesClient | 
| com.amazonaws.services.iot1clickprojects.AWSIoT1ClickProjectsAsyncClient | software.amazon.awssdk.services.iot1clickprojects.Iot1ClickProjectsAsyncClient | 
| com.amazonaws.services.iot1clickprojects.AWSIoT1ClickProjectsClient | software.amazon.awssdk.services.iot1clickprojects.Iot1ClickProjectsClient | 
| com.amazonaws.services.iotanalytics.AWSIoTAnalyticsAsyncClient | software.amazon.awssdk.services.iotanalytics.IotAnalyticsAsyncClient | 
| com.amazonaws.services.iotanalytics.AWSIoTAnalyticsClient | software.amazon.awssdk.services.iotanalytics.IotAnalyticsClient | 
| com.amazonaws.services.iotdata.AWSIotDataAsyncClient | software.amazon.awssdk.services.iotdata.IotDataAsyncClient | 
| com.amazonaws.services.iotdata.AWSIotDataClient | software.amazon.awssdk.services.iotdata.IotDataClient | 
| com.amazonaws.services.iotjobsdataplane.AWSIoTJobsDataPlaneAsyncClient | software.amazon.awssdk.services.iotdataplane.IotDataPlaneAsyncClient | 
| com.amazonaws.services.iotjobsdataplane.AWSIoTJobsDataPlaneClient | software.amazon.awssdk.services.iotdataplane.IotDataPlaneClient | 
| com.amazonaws.services.kinesis.AmazonKinesisAsyncClient | software.amazon.awssdk.services.kinesis.KinesisAsyncClient | 
| com.amazonaws.services.kinesis.AmazonKinesisClient | software.amazon.awssdk.services.kinesis.KinesisClient | 
| com.amazonaws.services.kinesisanalytics.AmazonKinesisAnalyticsAsyncClient | software.amazon.awssdk.services.kinesisanalytics.KinesisAnalyticsAsyncClient | 
| com.amazonaws.services.kinesisanalytics.AmazonKinesisAnalyticsClient | software.amazon.awssdk.services.kinesisanalytics.KinesisAnalyticsClient | 
| com.amazonaws.services.kinesisfirehose.AmazonKinesisFirehoseAsyncClient | software.amazon.awssdk.services.firehose.FirehoseAsyncClient | 
| com.amazonaws.services.kinesisfirehose.AmazonKinesisFirehoseClient | software.amazon.awssdk.services.firehose.FirehoseClient | 
| com.amazonaws.services.kinesisvideo.AmazonKinesisVideoArchivedMediaAsyncClient | software.amazon.awssdk.services.kinesisvideoarchivedmedia.KinesisVideoArchivedMediaAsyncClient | 
| com.amazonaws.services.kinesisvideo.AmazonKinesisVideoArchivedMediaClient | software.amazon.awssdk.services.kinesisvideoarchivedmedia.KinesisVideoArchivedMediaClient | 
| com.amazonaws.services.kinesisvideo.AmazonKinesisVideoAsyncClient | software.amazon.awssdk.services.kinesisvideo.KinesisVideoAsyncClient | 
| com.amazonaws.services.kinesisvideo.AmazonKinesisVideoClient | software.amazon.awssdk.services.kinesisvideo.KinesisVideoClient | 
| com.amazonaws.services.kinesisvideo.AmazonKinesisVideoMediaAsyncClient | software.amazon.awssdk.services.kinesisvideomedia.KinesisVideoMediaAsyncClient | 
| com.amazonaws.services.kinesisvideo.AmazonKinesisVideoMediaClient | software.amazon.awssdk.services.kinesisvideomedia.KinesisVideoMediaClient | 
| com.amazonaws.services.kinesisvideo.AmazonKinesisVideoPutMediaClient | Não suportado  | 
| com.amazonaws.services.kms.AWSKMSAsyncClient | software.amazon.awssdk.services.kms.KmsAsyncClient | 
| com.amazonaws.services.kms.AWSKMSClient | software.amazon.awssdk.services.kms.KmsClient | 
| com.amazonaws.services.lambda.AWSLambdaAsyncClient | software.amazon.awssdk.services.lambda.LambdaAsyncClient | 
| com.amazonaws.services.lambda.AWSLambdaClient | software.amazon.awssdk.services.lambda.LambdaClient | 
| com.amazonaws.services.lexmodelbuilding.AmazonLexModelBuildingAsyncClient | software.amazon.awssdk.services.lexmodelbuilding.LexModelBuildingAsyncClient | 
| com.amazonaws.services.lexmodelbuilding.AmazonLexModelBuildingClient | software.amazon.awssdk.services.lexmodelbuilding.LexModelBuildingClient | 
| com.amazonaws.services.lexruntime.AmazonLexRuntimeAsyncClient | software.amazon.awssdk.services.lexruntime.LexRuntimeAsyncClient | 
| com.amazonaws.services.lexruntime.AmazonLexRuntimeClient | software.amazon.awssdk.services.lexruntime.LexRuntimeClient | 
| com.amazonaws.services.lightsail.AmazonLightsailAsyncClient | software.amazon.awssdk.services.lightsail.LightsailAsyncClient | 
| com.amazonaws.services.lightsail.AmazonLightsailClient | software.amazon.awssdk.services.lightsail.LightsailClient | 
| com.amazonaws.services.logs.AWSLogsAsyncClient | software.amazon.awssdk.services.logs.LogsAsyncClient | 
| com.amazonaws.services.logs.AWSLogsClient | software.amazon.awssdk.services.logs.LogsClient | 
| com.amazonaws.services.machinelearning.AmazonMachineLearningAsyncClient | software.amazon.awssdk.services.machinelearning.MachineLearningAsyncClient | 
| com.amazonaws.services.machinelearning.AmazonMachineLearningClient | software.amazon.awssdk.services.machinelearning.MachineLearningClient | 
| com.amazonaws.services.macie.AmazonMacieAsyncClient | software.amazon.awssdk.services.macie.MacieAsyncClient | 
| com.amazonaws.services.macie.AmazonMacieClient | software.amazon.awssdk.services.macie.MacieClient | 
| com.amazonaws.services.marketplacecommerceanalytics.AWSMarketplaceCommerceAnalyticsAsyncClient | software.amazon.awssdk.services.marketplacecommerceanalytics.MarketplaceCommerceAnalyticsAsyncClient | 
| com.amazonaws.services.marketplacecommerceanalytics.AWSMarketplaceCommerceAnalyticsClient | software.amazon.awssdk.services.marketplacecommerceanalytics.MarketplaceCommerceAnalyticsClient | 
| com.amazonaws.services.marketplaceentitlement.AWSMarketplaceEntitlementAsyncClient | software.amazon.awssdk.services.marketplaceentitlement.MarketplaceEntitlementAsyncClient | 
| com.amazonaws.services.marketplaceentitlement.AWSMarketplaceEntitlementClient | software.amazon.awssdk.services.marketplaceentitlement.MarketplaceEntitlementClient | 
| com.amazonaws.services.marketplacemetering.AWSMarketplaceMeteringAsyncClient | software.amazon.awssdk.services.marketplacemetering.MarketplaceMeteringAsyncClient | 
| com.amazonaws.services.marketplacemetering.AWSMarketplaceMeteringClient | software.amazon.awssdk.services.marketplacemetering.MarketplaceMeteringClient | 
| com.amazonaws.services.mediaconvert.AWSMediaConvertAsyncClient | software.amazon.awssdk.services.mediaconvert.MediaConvertAsyncClient | 
| com.amazonaws.services.mediaconvert.AWSMediaConvertClient | software.amazon.awssdk.services.mediaconvert.MediaConvertClient | 
| com.amazonaws.services.medialive.AWSMediaLiveAsyncClient | software.amazon.awssdk.services.medialive.MediaLiveAsyncClient | 
| com.amazonaws.services.medialive.AWSMediaLiveClient | software.amazon.awssdk.services.medialive.MediaLiveClient | 
| com.amazonaws.services.mediapackage.AWSMediaPackageAsyncClient | software.amazon.awssdk.services.mediapackage.MediaPackageAsyncClient | 
| com.amazonaws.services.mediapackage.AWSMediaPackageClient | software.amazon.awssdk.services.mediapackage.MediaPackageClient | 
| com.amazonaws.services.mediastore.AWSMediaStoreAsyncClient | software.amazon.awssdk.services.mediastore.MediaStoreAsyncClient | 
| com.amazonaws.services.mediastore.AWSMediaStoreClient | software.amazon.awssdk.services.mediastore.MediaStoreClient | 
| com.amazonaws.services.mediastoredata.AWSMediaStoreDataAsyncClient | software.amazon.awssdk.services.mediastoredata.MediaStoreDataAsyncClient | 
| com.amazonaws.services.mediastoredata.AWSMediaStoreDataClient | software.amazon.awssdk.services.mediastoredata.MediaStoreDataClient | 
| com.amazonaws.services.mediatailor.AWSMediaTailorAsyncClient | software.amazon.awssdk.services.mediatailor.MediaTailorAsyncClient | 
| com.amazonaws.services.mediatailor.AWSMediaTailorClient | software.amazon.awssdk.services.mediatailor.MediaTailorClient | 
| com.amazonaws.services.migrationhub.AWSMigrationHubAsyncClient | software.amazon.awssdk.services.migrationhub.MigrationHubAsyncClient | 
| com.amazonaws.services.migrationhub.AWSMigrationHubClient | software.amazon.awssdk.services.migrationhub.MigrationHubClient | 
| com.amazonaws.services.mobile.AWSMobileAsyncClient | software.amazon.awssdk.services.mobile.MobileAsyncClient | 
| com.amazonaws.services.mobile.AWSMobileClient | software.amazon.awssdk.services.mobile.MobileClient | 
| com.amazonaws.services.mq.AmazonMQAsyncClient | software.amazon.awssdk.services.mq.MqAsyncClient | 
| com.amazonaws.services.mq.AmazonMQClient | software.amazon.awssdk.services.mq.MqClient | 
| com.amazonaws.services.mturk.AmazonMTurkAsyncClient | software.amazon.awssdk.services.mturk.MTurkAsyncClient | 
| com.amazonaws.services.mturk.AmazonMTurkClient | software.amazon.awssdk.services.mturk.MTurkClient | 
| com.amazonaws.services.neptune.AmazonNeptuneAsyncClient | software.amazon.awssdk.services.neptune.NeptuneAsyncClient | 
| com.amazonaws.services.neptune.AmazonNeptuneClient | software.amazon.awssdk.services.neptune.NeptuneClient | 
| com.amazonaws.services.opsworks.AWSOpsWorksAsyncClient | software.amazon.awssdk.services.opsworks.OpsWorksAsyncClient | 
| com.amazonaws.services.opsworks.AWSOpsWorksClient | software.amazon.awssdk.services.opsworks.OpsWorksClient | 
| com.amazonaws.services.opsworkscm.AWSOpsWorksCMAsyncClient | software.amazon.awssdk.services.opsworkscm.OpsWorksCmAsyncClient | 
| com.amazonaws.services.opsworkscm.AWSOpsWorksCMClient | software.amazon.awssdk.services.opsworkscm.OpsWorksCmClient | 
| com.amazonaws.services.organizations.AWSOrganizationsAsyncClient | software.amazon.awssdk.services.organizations.OrganizationsAsyncClient | 
| com.amazonaws.services.organizations.AWSOrganizationsClient | software.amazon.awssdk.services.organizations.OrganizationsClient | 
| com.amazonaws.services.pi.AWSPIAsyncClient | software.amazon.awssdk.services.pi.PiAsyncClient | 
| com.amazonaws.services.pi.AWSPIClient | software.amazon.awssdk.services.pi.PiClient | 
| com.amazonaws.services.pinpoint.AmazonPinpointAsyncClient | software.amazon.awssdk.services.pinpoint.PinpointAsyncClient | 
| com.amazonaws.services.pinpoint.AmazonPinpointClient | software.amazon.awssdk.services.pinpoint.PinpointClient | 
| com.amazonaws.services.polly.AmazonPollyAsyncClient | software.amazon.awssdk.services.polly.PollyAsyncClient | 
| com.amazonaws.services.polly.AmazonPollyClient | software.amazon.awssdk.services.polly.PollyClient | 
| com.amazonaws.services.pricing.AWSPricingAsyncClient | software.amazon.awssdk.services.pricing.PricingAsyncClient | 
| com.amazonaws.services.pricing.AWSPricingClient | software.amazon.awssdk.services.pricing.PricingClient | 
| com.amazonaws.services.rds.AmazonRDSAsyncClient | software.amazon.awssdk.services.rds.RdsAsyncClient | 
| com.amazonaws.services.rds.AmazonRDSClient | software.amazon.awssdk.services.rds.RdsClient | 
| com.amazonaws.services.redshift.AmazonRedshiftAsyncClient | software.amazon.awssdk.services.redshift.RedshiftAsyncClient | 
| com.amazonaws.services.redshift.AmazonRedshiftClient | software.amazon.awssdk.services.redshift.RedshiftClient | 
| com.amazonaws.services.rekognition.AmazonRekognitionAsyncClient | software.amazon.awssdk.services.rekognition.RekognitionAsyncClient | 
| com.amazonaws.services.rekognition.AmazonRekognitionClient | software.amazon.awssdk.services.rekognition.RekognitionClient | 
| com.amazonaws.services.resourcegroups.AWSResourceGroupsAsyncClient | software.amazon.awssdk.services.resourcegroups.ResourceGroupsAsyncClient | 
| com.amazonaws.services.resourcegroups.AWSResourceGroupsClient | software.amazon.awssdk.services.resourcegroups.ResourceGroupsClient | 
| com.amazonaws.services.resourcegroupstaggingapi.AWSResourceGroupsTaggingAPIAsyncClient | software.amazon.awssdk.services.resourcegroupstaggingapi.ResourceGroupsTaggingApiAsyncClient | 
| com.amazonaws.services.resourcegroupstaggingapi.AWSResourceGroupsTaggingAPIClient | software.amazon.awssdk.services.resourcegroupstaggingapi.ResourceGroupsTaggingApiClient | 
| com.amazonaws.services.route53.AmazonRoute53AsyncClient | software.amazon.awssdk.services.route53.Route53AsyncClient | 
| com.amazonaws.services.route53.AmazonRoute53Client | software.amazon.awssdk.services.route53.Route53Client | 
| com.amazonaws.services.route53domains.AmazonRoute53DomainsAsyncClient | software.amazon.awssdk.services.route53domains.Route53DomainsAsyncClient | 
| com.amazonaws.services.route53domains.AmazonRoute53DomainsClient | software.amazon.awssdk.services.route53domains.Route53DomainsClient | 
| com.amazonaws.services.s3.AmazonS3Client | software.amazon.awssdk.services.s3.S3Client | 
| com.amazonaws.services.sagemaker.AmazonSageMakerAsyncClient | software.amazon.awssdk.services.sagemaker.SageMakerAsyncClient | 
| com.amazonaws.services.sagemaker.AmazonSageMakerClient | software.amazon.awssdk.services.sagemaker.SageMakerClient | 
| com.amazonaws.services.sagemakerruntime.AmazonSageMakerRuntimeAsyncClient | software.amazon.awssdk.services.sagemakerruntime.SageMakerRuntimeAsyncClient | 
| com.amazonaws.services.sagemakerruntime.AmazonSageMakerRuntimeClient | software.amazon.awssdk.services.sagemakerruntime.SageMakerRuntimeClient | 
| com.amazonaws.services.secretsmanager.AWSSecretsManagerAsyncClient | software.amazon.awssdk.services.secretsmanager.SecretsManagerAsyncClient | 
| com.amazonaws.services.secretsmanager.AWSSecretsManagerClient | software.amazon.awssdk.services.secretsmanager.SecretsManagerClient | 
| com.amazonaws.services.securitytoken.AWSSecurityTokenServiceAsyncClient | software.amazon.awssdk.services.sts.StsAsyncClient | 
| com.amazonaws.services.securitytoken.AWSSecurityTokenServiceClient | software.amazon.awssdk.services.sts.StsClient | 
| com.amazonaws.services.serverlessapplicationrepository.AWSServerlessApplicationRepositoryAsyncClient | software.amazon.awssdk.services.serverlessapplicationrepository.ServerlessApplicationRepositoryAsyncClient | 
| com.amazonaws.services.serverlessapplicationrepository.AWSServerlessApplicationRepositoryClient | software.amazon.awssdk.services.serverlessapplicationrepository.ServerlessApplicationRepositoryClient | 
| com.amazonaws.services.servermigration.AWSServerMigrationAsyncClient | software.amazon.awssdk.services.sms.SmsAsyncClient | 
| com.amazonaws.services.servermigration.AWSServerMigrationClient | software.amazon.awssdk.services.sms.SmsClient | 
| com.amazonaws.services.servicecatalog.AWSServiceCatalogAsyncClient | software.amazon.awssdk.services.servicecatalog.ServiceCatalogAsyncClient | 
| com.amazonaws.services.servicecatalog.AWSServiceCatalogClient | software.amazon.awssdk.services.servicecatalog.ServiceCatalogClient | 
| com.amazonaws.services.servicediscovery.AWSServiceDiscoveryAsyncClient | software.amazon.awssdk.services.servicediscovery.ServiceDiscoveryAsyncClient | 
| com.amazonaws.services.servicediscovery.AWSServiceDiscoveryClient | software.amazon.awssdk.services.servicediscovery.ServiceDiscoveryClient | 
| com.amazonaws.services.shield.AWSShieldAsyncClient | software.amazon.awssdk.services.shield.ShieldAsyncClient | 
| com.amazonaws.services.shield.AWSShieldClient | software.amazon.awssdk.services.shield.ShieldClient | 
| com.amazonaws.services.simpledb.AmazonSimpleDBAsyncClient | software.amazon.awssdk.services.simpledb.SimpleDbAsyncClient | 
| com.amazonaws.services.simpledb.AmazonSimpleDBClient | software.amazon.awssdk.services.simpledb.SimpleDbClient | 
| com.amazonaws.services.simpleemail.AmazonSimpleEmailServiceAsyncClient | software.amazon.awssdk.services.ses.SesAsyncClient | 
| com.amazonaws.services.simpleemail.AmazonSimpleEmailServiceClient | software.amazon.awssdk.services.ses.SesClient | 
| com.amazonaws.services.simplesystemsmanagement.AWSSimpleSystemsManagementAsyncClient | software.amazon.awssdk.services.ssm.SsmAsyncClient | 
| com.amazonaws.services.simplesystemsmanagement.AWSSimpleSystemsManagementClient | software.amazon.awssdk.services.ssm.SsmClient | 
| com.amazonaws.services.simpleworkflow.AmazonSimpleWorkflowAsyncClient | software.amazon.awssdk.services.swf.SwfAsyncClient | 
| com.amazonaws.services.simpleworkflow.AmazonSimpleWorkflowClient | software.amazon.awssdk.services.swf.SwfClient | 
| com.amazonaws.services.snowball.AmazonSnowballAsyncClient | software.amazon.awssdk.services.snowball.SnowballAsyncClient | 
| com.amazonaws.services.snowball.AmazonSnowballClient | software.amazon.awssdk.services.snowball.SnowballClient | 
| com.amazonaws.services.sns.AmazonSNSAsyncClient | software.amazon.awssdk.services.sns.SnsAsyncClient | 
| com.amazonaws.services.sns.AmazonSNSClient | software.amazon.awssdk.services.sns.SnsClient | 
| com.amazonaws.services.sqs.AmazonSQSAsyncClient | software.amazon.awssdk.services.sqs.SqsAsyncClient | 
| com.amazonaws.services.sqs.AmazonSQSClient | software.amazon.awssdk.services.sqs.SqsClient | 
| com.amazonaws.services.stepfunctions.AWSStepFunctionsAsyncClient | software.amazon.awssdk.services.sfn.SfnAsyncClient | 
| com.amazonaws.services.stepfunctions.AWSStepFunctionsClient | software.amazon.awssdk.services.sfn.SfnClient | 
| com.amazonaws.services.storagegateway.AWSStorageGatewayAsyncClient | software.amazon.awssdk.services.storagegateway.StorageGatewayAsyncClient | 
| com.amazonaws.services.storagegateway.AWSStorageGatewayClient | software.amazon.awssdk.services.storagegateway.StorageGatewayClient | 
| com.amazonaws.services.support.AWSSupportAsyncClient | software.amazon.awssdk.services.support.SupportAsyncClient | 
| com.amazonaws.services.support.AWSSupportClient | software.amazon.awssdk.services.support.SupportClient | 
| com.amazonaws.services.transcribe.AmazonTranscribeAsyncClient | software.amazon.awssdk.services.transcribe.TranscribeAsyncClient | 
| com.amazonaws.services.transcribe.AmazonTranscribeClient | software.amazon.awssdk.services.transcribe.TranscribeClient | 
| com.amazonaws.services.translate.AmazonTranslateAsyncClient | software.amazon.awssdk.services.translate.TranslateAsyncClient | 
| com.amazonaws.services.translate.AmazonTranslateClient | software.amazon.awssdk.services.translate.TranslateClient | 
| com.amazonaws.services.waf.AWSWAFAsyncClient | software.amazon.awssdk.services.waf.WafAsyncClient | 
| com.amazonaws.services.waf.AWSWAFClient | software.amazon.awssdk.services.waf.WafClient | 
| com.amazonaws.services.waf.AWSWAFRegionalAsyncClient | software.amazon.awssdk.services.waf.regional.WafRegionalAsyncClient | 
| com.amazonaws.services.waf.AWSWAFRegionalClient | software.amazon.awssdk.services.waf.regional.WafRegionalClient | 
| com.amazonaws.services.workdocs.AmazonWorkDocsAsyncClient | software.amazon.awssdk.services.workdocs.WorkDocsAsyncClient | 
| com.amazonaws.services.workdocs.AmazonWorkDocsClient | software.amazon.awssdk.services.workdocs.WorkDocsClient | 
| com.amazonaws.services.workmail.AmazonWorkMailAsyncClient | software.amazon.awssdk.services.workmail.WorkMailAsyncClient | 
| com.amazonaws.services.workmail.AmazonWorkMailClient | software.amazon.awssdk.services.workmail.WorkMailClient | 
| com.amazonaws.services.workspaces.AmazonWorkspacesAsyncClient | software.amazon.awssdk.services.workspaces.WorkSpacesAsyncClient | 
| com.amazonaws.services.workspaces.AmazonWorkspacesClient | software.amazon.awssdk.services.workspaces.WorkSpacesClient | 
| com.amazonaws.services.xray.AWSXRayAsyncClient | software.amazon.awssdk.services.xray.XRayAsyncClient | 
| com.amazonaws.services.xray.AWSXRayClient | software.amazon.awssdk.services.xray.XRayClient | 

# Padrões de criação de clientes
<a name="client-creation-defaults"></a>

Na versão 2.x, as seguintes alterações foram feitas na lógica padrão de criação de clientes.
+ A cadeia de provedores de credenciais padrão para o S3 não inclui mais credenciais anônimas. Você deve especificar o acesso anônimo ao S3 manualmente usando o `AnonymousCredentialsProvider`.
+ As seguintes variáveis de ambiente relacionadas à criação de clientes estão diferentes.    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/sdk-for-java/latest/developer-guide/client-creation-defaults.html)
+ As seguintes propriedades do sistema relacionadas à criação do cliente padrão estão diferentes.     
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/sdk-for-java/latest/developer-guide/client-creation-defaults.html)
+ A versão 2.x não é compatível com as seguintes propriedades do sistema.
+     
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/sdk-for-java/latest/developer-guide/client-creation-defaults.html)
+ A configuração de carga de região de um arquivo `endpoints.json` personalizado não tem mais suporte.

# Configuração do cliente
<a name="client-configuration"></a>

Na 1.x, a configuração do cliente do SDK foi modificada pela configuração de uma instância de `ClientConfiguration` no cliente ou no builder do cliente. Na versão 2.x, a configuração do cliente é dividida em classes de configuração separadas. As classes de configuração separadas permitem configurar diferentes clientes HTTP para clientes assíncronos versus síncronos, mas ainda usam a mesma classe `ClientOverrideConfiguration`.

**Example da configuração do cliente na versão 1.x**  

```
AmazonDynamoDBClientBuilder.standard()
.withClientConfiguration(clientConfiguration)
.build()
```

**Example da configuração do cliente síncrono na versão 2.x**  

```
ProxyConfiguration.Builder proxyConfig = ProxyConfiguration.builder();

ApacheHttpClient.Builder httpClientBuilder =
        ApacheHttpClient.builder()
                        .proxyConfiguration(proxyConfig.build());

ClientOverrideConfiguration.Builder overrideConfig =
        ClientOverrideConfiguration.builder();

DynamoDbClient client =
        DynamoDbClient.builder()
                      .httpClientBuilder(httpClientBuilder)
                      .overrideConfiguration(overrideConfig.build())
                      .build();
```

**Example da configuração do cliente assíncrono na versão 2.x**  

```
NettyNioAsyncHttpClient.Builder httpClientBuilder =
        NettyNioAsyncHttpClient.builder();

ClientOverrideConfiguration.Builder overrideConfig =
        ClientOverrideConfiguration.builder();

ClientAsyncConfiguration.Builder asyncConfig =
        ClientAsyncConfiguration.builder();

DynamoDbAsyncClient client =
        DynamoDbAsyncClient.builder()
                           .httpClientBuilder(httpClientBuilder)
                           .overrideConfiguration(overrideConfig.build())
                           .asyncConfiguration(asyncConfig.build())
                           .build();
```

## Clientes HTTP
<a name="client-configuration-http"></a>

### Alterações importantes
<a name="client-configuration-http-notables"></a>
+ Na versão 2.x, é possível alterar qual cliente HTTP usar no runtime especificando uma implementação usando `clientBuilder.httpClientBuilder`.
+ Quando você passa um cliente HTTP usando `clientBuilder.httpClient` para um compilador de cliente de serviço, o cliente HTTP não é fechado por padrão se o cliente de serviço fecha. Isso permite compartilhar clientes HTTP entre clientes de serviço.
+ Clientes HTTP assíncronos agora usam E/S sem bloqueio.
+ Algumas operações agora usam HTTP/2 para melhorar o desempenho.

### Alterações de configurações
<a name="client-configuration-http-setting-diffs"></a>


| Configuração | 1.x | 2.x síncrono, Apache | 2.x assíncrono, Netty | 
| --- | --- | --- | --- | 
|  |  <pre>ClientConfiguration clientConfig = <br />    new ClientConfiguration()</pre>  |  <pre>ApacheHttpClient.Builder httpClientBuilder = <br />    ApacheHttpClient.builder()</pre>  |  <pre>NettyNioAsyncHttpClient.Builder httpClientBuilder = <br />    NettyNioAsyncHttpClient.builder()</pre>  | 
| Máximo de conexões |  <pre>clientConfig.setMaxConnections(...)<br />clientConfig.withMaxConnections(...)</pre>  |  <pre>httpClientBuilder.maxConnections(...)</pre>  |  <pre>httpClientBuilder.maxConcurrency(...)</pre>  | 
| Tempo limite da conexão |  <pre>clientConfig.setConnectionTimeout(...)<br />clientConfig.withConnectionTimeout(...)</pre>  |  <pre>httpClientBuilder.connectionTimeout(...)<br />httpClientBuilder.connectionAcquisitionTimeout(...)</pre>  |  <pre>httpClientBuilder.connectionTimeout(...)</pre>  | 
| Tempo limite do soquete |  <pre>clientConfig.setSocketTimeout(...)<br />clientConfig.withSocketTimeout(...)</pre>  |  <pre>httpClientBuilder.socketTimeout(...)</pre>  |  <pre>httpClientBuilder.writeTimeout(...)<br />httpClientBuilder.readTimeout(...)</pre>  | 
| Conexão TTL |  <pre>clientConfig.setConnectionTTL(...)<br />clientConfig.withConnectionTTL(...)</pre>  |  <pre>httpClientBuilder.connectionTimeToLive(...)</pre>  |  <pre>httpClientBuilder.connectionTimeToLive(...)</pre>  | 
| Máximo de inatividade da conexão |  <pre>clientConfig.setConnectionMaxIdleMillis(...)<br />clientConfig.withConnectionMaxIdleMillis(...)</pre>  |  <pre>httpClientBuilder.connectionMaxIdleTime(...)</pre>  |  <pre>httpClientBuilder.connectionMaxIdleTime(...)</pre>  | 
| Validar após inatividade |  <pre>clientConfig.setValidateAfterInactivityMillis(...)<br />clientConfig.withValidateAfterInactivityMillis(...)</pre>  | Incompatível ([recurso de solicitação](https://github.com/aws/aws-sdk-java-v2/issues/new)) | Incompatível ([recurso de solicitação](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
| Endereço local |  <pre>clientConfig.setLocalAddress(...)<br />clientConfig.withLocalAddress(...)</pre>  |  <pre>httpClientBuilder.localAddress(...)</pre>  | [Sem compatibilidade](https://github.com/aws/aws-sdk-java-v2/issues/857) | 
| Esperar-continuar ativado |  <pre>clientConfig.setUseExpectContinue(...)<br />clientConfig.withUseExpectContinue(...)</pre>  |  <pre>httpClientBuilder.expectContinueEnabled(...)</pre>  | Incompatível ([recurso de solicitação](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
| Finalizador de conexões |  <pre>clientConfig.setUseReaper(...)<br />clientConfig.withReaper(...)</pre>  |  <pre>httpClientBuilder.useIdleConnectionReaper(...)</pre>  |  <pre>httpClientBuilder.useIdleConnectionReaper(...)</pre>  | 
|  |  <pre>AmazonDynamoDBClientBuilder.standard()<br />    .withClientConfiguration(clientConfiguration)<br />    .build()</pre>  |  <pre>DynamoDbClient.builder()<br />    .httpClientBuilder(httpClientBuilder)<br />    .build()</pre>  |  <pre>DynamoDbAsyncClient.builder()<br />.httpClientBuilder(httpClientBuilder)<br />.build()</pre>  | 

## Proxies de cliente HTTP
<a name="client-configuration-http-proxy"></a>


| Configurações | 1.x | 2.x síncrono, Apache | 2.x assíncrono, Netty | 
| --- | --- | --- | --- | 
|  |  <pre>ClientConfiguration clientConfig =<br />    new ClientConfiguration()</pre>  |  <pre>ProxyConfiguration.Builder proxyConfig =<br />    ProxyConfiguration.builder()</pre>  |  <pre>ProxyConfiguration.Builder proxyConfig =<br />    ProxyConfiguration.builder()</pre>  | 
| Host do proxy |  <pre>clientConfig.setProxyHost(...)<br />clientConfig.withProxyHost(...)</pre>  |  <pre>proxyConfig.endpoint(...)</pre>  |  <pre>proxyConfig.host(...)</pre>  | 
| Porta do proxy |  <pre>clientConfig.setProxyPort(...)<br />clientConfig.withProxyPort(...)</pre>  |  <pre>proxyConfig.endpoint(...)</pre> A [porta proxy](http-configuration-apache.md#http-configuration-apache-proxy-conf-ex) está incorporada no `endpoint`  |  <pre>proxyConfig.port(...)</pre>  | 
| Nome de usuário do proxy |  <pre>clientConfig.setProxyUsername(...)<br />clientConfig.withProxyUsername(...)</pre>  |  <pre>proxyConfig.username(...)</pre>  |  <pre>proxyConfig.username(...)</pre>  | 
| Senha do proxy |  <pre>clientConfig.setProxyPassword(...)<br />clientConfig.withProxyPassword(...)</pre>  |  <pre>proxyConfig.password(...)</pre>  |  <pre>proxyConfig.password(...)</pre>  | 
| Domínio do proxy |  <pre>clientConfig.setProxyDomain(...)<br />clientConfig.withProxyDomain(...)</pre>  |  <pre>proxyConfig.ntlmDomain(...)</pre>  | Incompatível ([recurso de solicitação](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
| Estação de trabalho do proxy |  <pre>clientConfig.setProxyWorkspace(...)<br />clientConfig.withProxyWorkstation(...)</pre>  |  <pre>proxyConfig.ntlmWorkstation(...)</pre>  | Incompatível ([recurso de solicitação](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
| Métodos de autenticação de proxy |  <pre>clientConfig.setProxyAuthenticationMethods(...)<br />clientConfig.withProxyAuthenticationMethods(...)</pre>  |  [Não suportado](https://github.com/aws/aws-sdk-java-v2/issues/858)  | Incompatível ([recurso de solicitação](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
| Autenticação preemptiva básica de proxy |  <pre>clientConfig.setPreemptiveBasicProxyAuth(...)<br />clientConfig.withPreemptiveBasicProxyAuth(...)</pre>  |  <pre>proxyConfig.preemptiveBasicAuthenticationEnabled(...)</pre>  | Incompatível ([recurso de solicitação](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
| Hosts sem proxy |  <pre>clientConfig.setNonProxyHosts(...)<br />clientConfig.withNonProxyHosts(...)</pre>  |  <pre>proxyConfig.nonProxyHosts(...)</pre>  |  <pre>proxyConfig.nonProxyHosts(...)</pre>  | 
| Desativar proxy de soquete |  <pre>clientConfig.setDisableSocketProxy(...)<br />clientConfig.withDisableSocketProxy(...)</pre>  | Incompatível ([recurso de solicitação](https://github.com/aws/aws-sdk-java-v2/issues/new)) | Incompatível ([recurso de solicitação](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
|  |  <pre>AmazonDynamoDBClientBuilder.standard()<br />    .withClientConfiguration(clientConfiguration)<br />    .build()</pre>  |  <pre>httpClientBuilder.proxyConfiguration(<br />    proxyConfig.build())</pre>  |  <pre>httpClientBuilder.proxyConfiguration(<br />    proxyConfig.build())</pre>  | 

## Substituições de clientes
<a name="client-override-config-diffs"></a>


| Configuração | 1.x | 2.x | 
| --- | --- | --- | 
|  |  <pre>ClientConfiguration clientConfig =<br />    new ClientConfiguration()</pre>  |  <pre>ClientOverrideConfiguration.Builder overrideConfig =<br />    ClientOverrideConfiguration.builder()</pre>  | 
| Prefixo do agente do usuário |  <pre>clientConfig.setUserAgentPrefix(...)<br />clientConfig.withUserAgentPrefix(...)</pre>  |  <pre>overrideConfig.advancedOption(<br />    SdkAdvancedClientOption.USER_AGENT_PREFIX, ...)</pre>  | 
| Sufixo do agente do usuário |  <pre>clientConfig.setUserAgentSuffix(...)<br />clientConfig.withUserAgentSuffix(...)</pre>  |  <pre>overrideConfig.advancedOption(<br />    SdkAdvancedClientOption.USER_AGENT_SUFFIX, ...)</pre>  | 
| Signer |  <pre>clientConfig.setSignerOverride(...)<br />clientConfig.withSignerOverride(...)</pre>  |  <pre>overrideConfig.advancedOption(<br />    SdkAdvancedClientOption.SIGNER, ...)</pre>  | 
| Cabeçalhos adicionais |  <pre>clientConfig.addHeader(...)<br />clientConfig.withHeader(...)</pre>  |  <pre>overrideConfig.putHeader(...)</pre>  | 
| Tempo limite da solicitação |  <pre>clientConfig.setRequestTimeout(...)<br />clientConfig.withRequestTimeout(...)</pre>  |  <pre>overrideConfig.apiCallAttemptTimeout(...)</pre>  | 
| Tempo limite de execução de cliente |  <pre>clientConfig.setClientExecutionTimeout(...)<br />clientConfig.withClientExecutionTimeout(...)</pre>  |  <pre>overrideConfig.apiCallTimeout(...)</pre>  | 
| Usar Gzip |  <pre>clientConfig.setUseGzip(...)<br />clientConfig.withGzip(...)</pre>  |  Incompatível ([recurso de solicitação](https://github.com/aws/aws-sdk-java-v2/issues/new))  | 
| Dicas de tamanho do buffer de soquete |  <pre>clientConfig.setSocketBufferSizeHints(...)<br />clientConfig.withSocketBufferSizeHints(...)</pre>  | Incompatível ([recurso de solicitação](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
| Metadados de resposta do cache |  <pre>clientConfig.setCacheResponseMetadata(...)<br />clientConfig.withCacheResponseMetadata(...)</pre>  | Incompatível ([recurso de solicitação](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
| Metadado do cache de metadados da resposta |  <pre>clientConfig.setResponseMetadataCacheSize(...)<br />clientConfig.withResponseMetadataCacheSize(...)</pre>  | Incompatível ([recurso de solicitação](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
| resolvedor de DNS |  <pre>clientConfig.setDnsResolver(...)<br />clientConfig.withDnsResolver(...)</pre>  | Incompatível ([recurso de solicitação](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
| keepalive de TCP |  <pre>clientConfig.setUseTcpKeepAlive(...)<br />clientConfig.withTcpKeepAlive(...)</pre>  |  Essa opção agora está na configuração do cliente HTTP <pre>- ApacheHttpClient.builder().tcpKeepAlive(true)<br />- NettyNioAsyncHttpClient.builder().tcpKeepAlive(true)</pre>  | 
| Aleatório seguro |  <pre>clientConfig.setSecureRandom(...)<br />clientConfig.withSecureRandom(...)</pre>  | Incompatível ([recurso de solicitação](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
|  |  <pre>AmazonDynamoDBClientBuilder.standard()<br />    .withClientConfiguration(clientConfiguration)<br />    .build()</pre>  |  <pre>DynamoDbClient.builder()<br />    .overrideConfiguration(overrideConfig.build())<br />    .build()</pre>  | 

## Novas tentativas de substituição de cliente
<a name="client-override-retry-config-diffs"></a>


| Configuração | 1.x | 2.x | 
| --- | --- | --- | 
|  |  <pre>ClientConfiguration clientConfig =<br />    new ClientConfiguration()</pre>  |  <pre>ClientOverrideConfiguration.Builder overrideConfigBuilder = <br />    ClientOverrideConfiguration.builder();</pre>  | 
| Máximo de novas tentativas em erros |  <pre>clientConfig.setMaxErrorRetry(...)<br />clientConfig.withMaxErrorRetry(...)</pre>  |  <pre>// Configure the default retry strategy.<br />overrideConfigBuilder.retryStrategy(b -> b.maxAttempts(...));</pre>  | 
| Usar novas com controle de utilização |  <pre>clientConfig.setUseThrottleRetries(...)<br />clientConfig.withUseThrottleRetries(...)</pre>  | [Sem compatibilidade](https://github.com/aws/aws-sdk-java-v2/issues/645) | 
| Máximo de novas tentativas consecutivas antes do controle de utilização |  <pre>clientConfig.setMaxConsecutiveRetriesBeforeThrottling(...)<br />clientConfig.withMaxConsecutiveRetriesBeforeThrottling(...)</pre>  | [Sem compatibilidade](https://github.com/aws/aws-sdk-java-v2/issues/645) | 
|  |  <pre>AmazonDynamoDBClientBuilder.standard()<br />    .withClientConfiguration(clientConfiguration)<br />    .build()</pre>  |  <pre>DynamoDbClient.builder()<br />        .overrideConfiguration(overrideConfigBuilder.build())<br />        .build();<br /><br />// You also have the option to use a lambda expression to configure and<br />// build the 'ClientOverrideConfiguration.Builder'.<br />DynamoDbClient client = DynamoDbClient.builder()<br />        .overrideConfiguration(o -> o.retryStrategy(b -> b.maxAttempts(5)))<br />        .build();</pre>  | 

## Clientes assíncronos
<a name="client-async-config-diffs"></a>


| Configuração | 1.x | 2.x | 
| --- | --- | --- | 
|  |  |  <pre>ClientAsyncConfiguration.Builder asyncConfig =<br />    ClientAsyncConfiguration.builder()</pre>  | 
| Executor |  <pre>AmazonDynamoDBAsyncClientBuilder.standard()<br />    .withExecutorFactory(...)<br />    .build()</pre>  |  <pre>asyncConfig.advancedOption(<br />    SdkAdvancedAsyncClientOption.FUTURE_COMPLETION_EXECUTOR, ...)</pre>  | 
|  |  |  <pre>DynamoDbAsyncClient.builder()<br />    .asyncConfiguration(asyncConfig)<br />    .build()</pre>  | 

## Outras alterações de cliente
<a name="client-config-other-diffs"></a>

A opção `ClientConfiguration` a seguir, da 1.x, foi alterada na versão 2.x do SDK e não tem um equivalente direto.


| Configuração | 1.x | Equivalente de 2.x | 
| --- | --- | --- | 
| Protocolo |  <pre>clientConfig.setProtocol(Protocol.HTTP)<br />clientConfig.withProtocol(Protocol.HTTP)</pre>  |  A configuração de protocolo é HTTPS por padrão. Para modificar a configuração, especifique a configuração do protocolo de um endpoint HTTP no compilador de cliente: <pre>clientBuilder.endpointOverride(<br />    URI.create("http://..."))</pre>  | 

# Alterações no provedor de credenciais
<a name="migration-client-credentials"></a>

Esta seção fornece um mapeamento das alterações de nomes de classes e métodos do provedor de credenciais entre as versões 1.x e 2.x do AWS SDK para Java. 

## Diferenças notáveis
<a name="client-credentials"></a>
+ O provedor de credenciais padrão carrega as propriedades do sistema antes das variáveis de ambiente na versão 2.x. Para obter mais informações, consulte [Uso de credenciais](credentials.md).
+ O método construtor é substituído pelos métodos `create` ou `builder`.  
**Example**  

  ```
  DefaultCredentialsProvider.create();
  ```
+ A atualização assíncrona não é mais definida por padrão. Você deve especificá-la com o `builder` do provedor de credenciais.  
**Example**  

  ```
  ContainerCredentialsProvider provider = ContainerCredentialsProvider.builder()
          		.asyncCredentialUpdateEnabled(true)
          		.build();
  ```
+ Você pode especificar um caminho para um arquivo de perfil personalizado usando o `ProfileCredentialsProvider.builder()`.  
**Example**  

  ```
  ProfileCredentialsProvider profile = ProfileCredentialsProvider.builder()
          		.profileFile(ProfileFile.builder().content(Paths.get("myProfileFile.file")).build())
          		.build();
  ```
+ O formato do arquivo de perfil foi alterado para melhor corresponder à AWS CLI. Para obter detalhes, consulte [Configuração da AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html) no *Guia do usuário da AWS Command Line Interface*.

## Alterações no provedor de credenciais mapeadas entre as versões 1.x e 2.x
<a name="credentials-changes-mapping"></a>

### `AWSCredentialsProvider`
<a name="credentials-provider-changes-AWSCredentialsProvider"></a>


| Alterar categoria | 1.x | 2.x | 
| --- | --- | --- | 
| Nome de classe/pacote | com.amazonaws.auth.AWSCredentialsProvider | software.amazon.awssdk.auth.credentials.AwsCredentialsProvider | 
| Nome de método | getCredentials | resolveCredentials | 
| Método incompatível | refresh | Não compatível | 

### `DefaultAWSCredentialsProviderChain`
<a name="credentials-provider-changes-DefaultAWSCredentialsProviderChain"></a>


| Alterar categoria | 1.x | 2.x | 
| --- | --- | --- | 
| Nome de classe/pacote | com.amazonaws.auth.DefaultAWSCredentialsProviderChain | software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider | 
| Criação | new DefaultAWSCredentialsProviderChain | DefaultCredentialsProvider.create | 
| Método incompatível | getInstance | Não compatível | 
| Ordem de prioridade das configurações externas |  Variáveis de ambiente têm prioridade sobre as propriedades do sistema  |  Propriedades do sistema têm prioridade sobre as variáveis de ambiente  | 

### `AWSStaticCredentialsProvider`
<a name="credentials-provider-changes-AWSStaticCredentialsProvider"></a>


| Alterar categoria | 1.x | 2.x | 
| --- | --- | --- | 
| Nome de classe/pacote | com.amazonaws.auth.AWSStaticCredentialsProvider | software.amazon.awssdk.auth.credentials.StaticCredentialsProvider | 
| Criação | new AWSStaticCredentialsProvider | StaticCredentialsProvider.create | 

### `EnvironmentVariableCredentialsProvider`
<a name="credentials-provider-changes-EnvironmentVariableCredentialsProvider"></a>


| Alterar categoria | 1.x | 2.x | 
| --- | --- | --- | 
| Nome de classe/pacote | com.amazonaws.auth.EnvironmentVariableCredentialsProvider | software.amazon.awssdk.auth.credentials.EnvironmentVariableCredentialsProvider | 
| Criação | new EnvironmentVariableCredentialsProvider | EnvironmentVariableCredentialsProvider.create | 
| Nome de variáveis de ambiente | AWS\$1ACCESS\$1KEY | AWS\$1ACCESS\$1KEY\$1ID | 
|  | AWS\$1SECRET\$1KEY | AWS\$1SECRET\$1ACCESS\$1KEY | 

### `SystemPropertiesCredentialsProvider`
<a name="credentials-provider-changes-SystemPropertiesCredentialsProvider"></a>


| Alterar categoria | 1.x | 2.x | 
| --- | --- | --- | 
| Nome de classe/pacote | com.amazonaws.auth.SystemPropertiesCredentialsProvider | software.amazon.awssdk.auth.credentials.SystemPropertyCredentialsProvider | 
| Criação | new SystemPropertiesCredentialsProvider | SystemPropertiesCredentialsProvider.create | 
| Nome da propriedade do sistema | aws.secretKey | aws.secretAccessKey | 

### `ProfileCredentialsProvider`
<a name="credentials-provider-changes-ProfileCredentialsProvider"></a>


| Alterar categoria | 1.x | 2.x | 
| --- | --- | --- | 
| Nome de classe/pacote | com.amazonaws.auth.profile.ProfileCredentialsProvider | software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider | 
| Criação | new ProfileCredentialsProvider | ProfileCredentialsProvider.create | 
| Local do perfil personalizado |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/sdk-for-java/latest/developer-guide/migration-client-credentials.html)  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/sdk-for-java/latest/developer-guide/migration-client-credentials.html)  | 

### `ContainerCredentialsProvider`
<a name="credentials-provider-changes-ContainerCredentialsProvider"></a>


| Alterar categoria | 1.x | 2.x | 
| --- | --- | --- | 
| Nome de classe/pacote | com.amazonaws.auth.ContainerCredentialsProvider | software.amazon.awssdk.auth.credentials.ContainerCredentialsProvider | 
| Criação | new ContainerCredentialsProvider | ContainerCredentialsProvider.create | 
| Especificar a atualização assíncrona | Não compatível | Comportamento padrão | 

### `InstanceProfileCredentialsProvider`
<a name="credentials-provider-changes-InstanceProfileCredentialsProvider"></a>


| Alterar categoria | 1.x | 2.x | 
| --- | --- | --- | 
| Nome de classe/pacote | com.amazonaws.auth.InstanceProfileCredentialsProvider | software.amazon.awssdk.auth.credentials.InstanceProfileCredentialsProvider | 
| Criação | new InstanceProfileCredentialsProvider | InstanceProfileCredentialsProvider.create | 
| Especificar a atualização assíncrona | new InstanceProfileCredentialsProvider(true) |  `InstanceProfileCredentialProvider.builder().asyncCredentialUpdateEnabled(true).build()`  | 
| Nome da propriedade do sistema | com.amazonaws.sdk.disableEc2Metadata | aws.disableEc2Metadata | 
|  | com.amazonaws.sdk.ec2MetadataServiceEndpointOverride | aws.ec2MetadataServiceEndpoint | 

### `STSAssumeRoleSessionCredentialsProvider`
<a name="credentials-provider-changes-STSAssumeRoleSessionCredentialsProvider"></a>


| Alterar categoria | 1.x | 2.x | 
| --- | --- | --- | 
| Nome de classe/pacote | com.amazonaws.auth.STSAssumeRoleSessionCredentialsProvider | software.amazon.awssdk.services.sts.auth.StsAssumeRoleCredentialsProvider | 
| Criação |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/sdk-for-java/latest/developer-guide/migration-client-credentials.html)  | StsAssumeRoleCredentialsProvider.builder | 
| Atualização assíncrona | Comportamento padrão | Comportamento padrão | 
| Configuração | new STSAssumeRoleSessionCredentialsProvider.Builder | Configurar uma solicitação StsClient e AssumeRoleRequest | 

### `STSSessionCredentialsProvider`
<a name="credentials-provider-changes-STSSessionCredentialsProvider"></a>


| Alterar categoria | 1.x | 2.x | 
| --- | --- | --- | 
| Nome de classe/pacote | com.amazonaws.auth.STSSessionCredentialsProvider | software.amazon.awssdk.services.sts.auth.StsGetSessionTokenCredentialsProvider | 
| Criação |  `new STSSessionCredentialsProvider`  | StsGetSessionTokenCredentialsProvider.builder | 
| Atualização assíncrona | Comportamento padrão | StsGetSessionTokenCredentialsProvider.builder | 
| Configuração | Parâmetros do construtor | Configurar uma solicitação StsClient e GetSessionTokenRequest em um compilador | 

### `WebIdentityFederationSessionCredentialsProvider`
<a name="credentials-provider-changes-WebIdentityFederationSessionCredentialsProvider"></a>


| Alterar categoria | 1.x | 2.x | 
| --- | --- | --- | 
| Nome de classe/pacote | com.amazonaws.auth.WebIdentityFederationSessionCredentialsProvider | software.amazon.awssdk.services.sts.auth.StsAssumeRoleWithWebIdentityCredentialsProvider | 
| Criação |  `new WebIdentityFederationSessionCredentialsProvider`  | StsAssumeRoleWithWebIdentityCredentialsProvider.builder | 
| Atualização assíncrona | Comportamento padrão | StsAssumeRoleWithWebIdentityCredentialsProvider.builder | 
| Configuração | Parâmetros do construtor | Configurar uma solicitação StsClient e AssumeRoleWithWebIdentityRequest em um compilador | 

### Classes substituídas
<a name="credentials-provider-changes-Replacements"></a>


| Classe 1.x | Classes de substituição 2.x | 
| --- | --- | 
| com.amazonaws.auth.EC2ContainerCredentialsProviderWrapper | software.amazon.awssdk.auth.credentials.ContainerCredentialsProvider e software.amazon.awssdk.auth.credentials.InstanceProfileCredentialsProvider | 
| com.amazonaws.services.s3.S3CredentialsProviderChain | software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider e software.amazon.awssdk.auth.credentials.AnonymousCredentialsProvider | 

### Classes removidas
<a name="credentials-provider-changes-Removed"></a>


| Classe 1.x | 
| --- | 
| com.amazonaws.auth.ClasspathPropertiesFileCredentialsProvider | 
| com.amazonaws.auth.PropertiesFileCredentialsProvider | 

# Alterações de região
<a name="migration-client-region"></a>

Esta seção descreve as mudanças implementadas no AWS SDK para Java 2.x para usar as classes `Region` e `Regions`.

## Configuração de região
<a name="region-configuration"></a>
+ Alguns serviços da AWS não têm endpoints específicos da região. Ao usar esses serviços, você deve definir a região como `Region.AWS_GLOBAL` ou `Region.AWS_CN_GLOBAL`.  
**Example**  

  ```
  Region region = Region.AWS_GLOBAL;
  ```
+  As classes `com.amazonaws.regions.Regions` e `com.amazonaws.regions.Region` agora estão combinadas em uma classe `software.amazon.awssdk.regions.Region`.

## Mapeamentos de nome de método e classe
<a name="region-method-mapping"></a>

As seguintes tabelas mapeiam classes relacionadas à região entre as versões 1.x e 2.x do AWS SDK para Java. Você pode criar uma instância dessas classes usando o método `of()`.

**Example**  

```
RegionMetadata regionMetadata = RegionMetadata.of(Region.US_EAST_1);
```


**Alterações nos métodos da classe de regiões 1.x**  

| 1.x | 2.x | 
| --- | --- | 
|  `Regions.fromName`  |  `Region.of`  | 
|  `Regions.getName`  |  `Region.id`  | 
|  `Regions.getDescription`  |  `Region.metadata().description()`  | 
|  `Regions.getCurrentRegion`  |  Sem suporte  | 
|  `Regions.DEFAULT_REGION`  |  Sem suporte  | 
|  `Regions.name`  |  `Region.id`  | 


**Alterações nos métodos da classe da região 1.x**  

| 1.x | 2.x | 
| --- | --- | 
|  `Region.getName`  |  `Region.id`  | 
|  `Region.hasHttpsEndpoint`  |  Sem suporte  | 
|  `Region.hasHttpEndpoint`  |  Sem suporte  | 
|  `Region.getAvailableEndpoints`  |  Sem suporte  | 
|  `Region.createClient`  |  Sem suporte  | 


**Alterações nos métodos da classe RegionMetadata**  

| 1.x | 2.x | 
| --- | --- | 
|  `RegionMetadata.getName`  |  `RegionMetadata.name`  | 
|  `RegionMetadata.getDomain`  |  `RegionMetadata.domain`  | 
|  `RegionMetadata.getPartition`  |  `RegionMetadata.partition`  | 


**Alterações nos métodos da classe ServiceMetadata**  

| 1.x | 2.x | 
| --- | --- | 
|  `Region.getServiceEndpoint`  |  `ServiceMetadata.endpointFor(Region)`  | 
|  `Region.isServiceSupported`  |  `ServiceMetadata.regions().contains(Region)`  | 

# Alterações de operações, solicitações e respostas
<a name="migration-operation-requests-responses"></a>

Na versão 2 do SDK para Java, as solicitações são passadas para uma operação do cliente. Por exemplo, `DynamoDbClient's` `PutItemRequest` é passado para a operação `DynamoDbClient.putItem`. Essas operações retornam uma resposta do AWS service (Serviço da AWS), como `PutItemResponse` a.

A versão 2 do SDK para Java tem as seguintes alterações em relação à versão 1.
+ As operações com várias páginas de resposta agora têm um método `Paginator` para iterar automaticamente todos os itens na resposta.
+ Você não pode alterar solicitações e respostas.
+ Você deve criar solicitações e respostas com um método de criador estático em vez de um compilador. Por exemplo, a versão 1 `new PutItemRequest().withTableName(...)` agora é `PutItemRequest.builder().tableName(...).build()`.
+ As operações permitem usar uma forma abreviada de criar solicitações: `dynamoDbClient.putItem(request -> request.tableName(...))`.

As seguintes seções descrevem as alterações específicas entre a versão 1 e a versão 2. Algumas alterações de tipo de parâmetro podem ser convertidas automaticamente usando a [ferramenta de migração](migration-tool.md), enquanto outras mudanças exigem atualizações manuais em seu código.

# Alterações no parâmetro de data
<a name="migration-date-parameters"></a>

Na versão 1, muitas operações aceitavam objetos `java.util.Date` para parâmetros baseados em tempo. Na versão 2, essas operações usam objetos `java.time.Instant` em vez disso.

Você pode converter parâmetros `Date` automaticamente usando a [ferramenta de migração](migration-tool.md) ou pode convertê-los manualmente chamando o método `toInstant()` no objeto `Date`.

**Example – Gerar um URL pré-assinado com uma data de expiração na versão 1**  

```
// Generate a presigned URL that expires at a specific date
Date expiration = new Date(System.currentTimeMillis() + 3600000); // 1 hour from now
URL presignedUrl = s3Client.generatePresignedUrl(bucketName, keyName, expiration);
```

**Example – Gerar um URL pré-assinado com um instante de expiração na versão 2**  

```
// Generate a presigned URL that expires at a specific instant
Date expiration = new Date(System.currentTimeMillis() + 3600000); // 1 hour from now
PresignedGetObjectRequest presignedRequest = presigner.presignGetObject(
    GetObjectPresignRequest.builder()
        .getObjectRequest(GetObjectRequest.builder()
            .bucket(bucketName)
            .key(keyName)
            .build())
        .signatureDuration(Duration.between(Instant.now(), expiration.toInstant()))
        .build());
```

# Alterações de gerenciamento de dados binários
<a name="migration-binary-data"></a>

Na versão 1, os dados binários eram gerenciados usando objetos `ByteBuffer` diretamente. Na versão 2, o SDK usa objetos `SdkBytes` que fornecem uma maneira mais conveniente e segura de trabalhar com dados binários.

Você pode converter `SdkBytes` para `ByteBuffer` automaticamente usando a [ferramenta de migração](migration-tool.md) ou pode convertê-los manualmente chamando `asByteBuffer()` no objeto `SdkBytes` retornado.

**Example – Obter dados binários de um atributo de mensagem na versão 1**  

```
// Get binary data from a message attribute
MessageAttributeValue messageAttributeValue = new MessageAttributeValue();
ByteBuffer binaryValue = messageAttributeValue.getBinaryValue();
String binaryString = new String(messageAttributeValue.getBinaryValue().array());
```

**Example – Obter dados binários de um atributo de mensagem na versão 2**  

```
// Get binary data from a message attribute
MessageAttributeValue messageAttributeValue = MessageAttributeValue.builder().build();
ByteBuffer binaryValue = messageAttributeValue.binaryValue().asByteBuffer();
String binaryString = new String(messageAttributeValue.binaryValue().asByteBuffer().array());
```

# Alterações de parâmetros de tempo limite
<a name="migration-timeout-parameters"></a>

Na versão 1, os valores de tempo limite foram especificados como valores inteiros representando milissegundos. Na versão 2, os parâmetros de tempo limite usam objetos `java.time.Duration` para garantir maior segurança de tipos e mais clareza.

É possível converter valores numéricos de tempo limite automaticamente usando a [ferramenta de migração](migration-tool.md) ou convertê-los manualmente agrupando seus valores numéricos com o método de fábrica `Duration` apropriado.

**Example – Definir um tempo limite de solicitação na versão 1**  

```
// Set request timeout in milliseconds
ClientConfiguration clientConfiguration = new ClientConfiguration();
clientConfiguration.setRequestTimeout(5000); // 5 seconds
```

**Example – Definir um tempo limite de solicitação na versão 2**  

```
// Set request timeout using Duration
ClientConfiguration clientConfiguration = new ClientConfiguration();
clientConfiguration.setRequestTimeout(Duration.ofMillis(5000)); // 5 seconds

// Or more clearly:
clientConfiguration.setRequestTimeout(Duration.ofSeconds(5)); // 5 seconds
```

É possível usar os seguintes métodos de fábrica `Duration` para valores de tempo limite:
+ `Duration.ofMillis(long millis)`: para valores de milissegundos.
+ `Duration.ofSeconds(long seconds)`: para valores de segundos.
+ `Duration.ofMinutes(long minutes)`: para valores de minutos.

# Diferenças de operação de streaming entre 1.x e 2.x do AWS SDK para Java
<a name="migration-streaming-ops"></a>

As operações de streaming, como Amazon S3 `getObject` e `putObject` métodos, oferecem suporte ao não bloqueio I/O na versão 2.x do SDK. Como resultado, os objetos de modelo de solicitação e resposta não usam mais `InputStream` como parâmetro. Em vez disso, para solicitações síncronas, o objeto de solicitação aceita `RequestBody`, que é um fluxo de bytes. O equivalente assíncrono aceita um `AsyncRequestBody`.

**Example da operação `putObject` do Amazon S3 na versão 1.x**  

```
s3client.putObject(BUCKET, KEY, new File(file_path));
```

**Example da operação `putObject` do Amazon S3 na versão 2.x**  

```
s3client.putObject(PutObjectRequest.builder()
                                 .bucket(BUCKET)
                                 .key(KEY)
                                 .build(),
                 RequestBody.of(Paths.get("myfile.in")));
```

Em paralelo, o objeto de resposta aceita `ResponseTransformer` para clientes síncronos e `AsyncResponseTransformer` para clientes assíncronos na V2.

**Example da operação `getObject` do Amazon S3 na versão 1.x**  

```
S3Object o = s3.getObject(bucket, key);
S3ObjectInputStream s3is = o.getObjectContent();
FileOutputStream fos = new FileOutputStream(new File(key));
```

**Example da operação `getObject` do Amazon S3 na versão 2.x**  

```
s3client.getObject(GetObjectRequest.builder().bucket(bucket).key(key).build(),
		ResponseTransformer.toFile(Paths.get("key")));
```

No SDK para Java 2.x, as operações de resposta de streaming têm um método `AsBytes` para carregar a resposta na memória e simplificar as conversões de tipos comuns na memória.

# Diferenças de serialização entre 1.x e 2.x do AWS SDK para Java
<a name="migration-serialization-changes"></a>

## Diferença entre listar objetos e os parâmetros da solicitação
<a name="serialization-diffs-list-obj-to-req-param"></a>

O SDK para Java v1.x e v2.x diferem na forma como serializam objetos List para solicitar parâmetros.

O SDK para Java 1.x não serializa uma lista vazia, enquanto o SDK para Java 2.x serializa uma lista vazia como um parâmetro vazio.

Por exemplo, pense em um serviço com uma `SampleOperation` que exija uma `SampleRequest`. A `SampleRequest` aceita dois parâmetros: um tipo de string `str1` e um tipo de lista `listParam`: conforme mostrado nos exemplos a seguir.

**Example de `SampleOperation` na 1.x**  

```
SampleRequest v1Request = new SampleRequest()
    .withStr1("TestName");

sampleServiceV1Client.sampleOperation(v1Request);
```
O registro em log em nível de transferência mostra que o parâmetro `listParam` não está serializado.  

```
Action=SampleOperation&Version=2011-01-01&str1=TestName
```

**Example de `SampleOperation` na 2.x**  

```
sampleServiceV2Client.sampleOperation(b -> b
    .str1("TestName"));
```
O registro em log em nível de transferência mostra que o parâmetro `listParam` está serializado sem valor.  

```
Action=SampleOperation&Version=2011-01-01&str1=TestName&listParam=
```

## POJOs na V1 em comparação com os construtores na V2
<a name="serialization-json-objects"></a>

Como o SDK V1 para Java usa classes POJO mutáveis, as bibliotecas de serialização e desserialização, como [Jackson](https://github.com/FasterXML/jackson-docs), podem usar objetos de modelo diretamente. 

Por outro lado, o SDK V2 para Java usa objetos de modelo imutáveis. Você deve usar um compilador intermediário para realizar a (des)serialização.

O exemplo a seguir mostra as diferenças entre de/serializing uma chamada de `headBucket` API com V1 e V2 usando um Jackson. `ObjectMapper`

```
    public void sendRequest() throws IOException {
        final String bucketName = "amzn-s3-demo-bucket";
        final ObjectMapper mapper = new ObjectMapper();

        // V1 uses POJOs to serialize and deserialize.
        final AmazonS3 v1S3Client = AmazonS3ClientBuilder.defaultClient();
        HeadBucketResult resultV1 = v1S3Client.headBucket(
            new HeadBucketRequest(bucketName));

        String v1Serialized = mapper.writeValueAsString(resultV1);

        HeadBucketResult deserializedV1 = mapper.readValue(v1Serialized, HeadBucketResult.class);
        
        // V2 uses builders to serialize and deserialize.
        S3Client v2S3Client = S3Client.create();
        HeadBucketResponse v2Response = v2S3Client.headBucket(
            b -> b.bucket(bucketName));

        String v2Serialized = mapper.writeValueAsString(
            v2Response.toBuilder());

        HeadBucketResponse v2Deserialized = mapper.readValue(
            v2Serialized, HeadBucketResponse.serializableBuilderClass())
            .build();
    }
```

# Diferenças de desserialização entre 1.x e 2.x do AWS SDK para Java
<a name="migration-deserialization-changes"></a>

## Coleções vazias na V2 em comparação com `nulls` na V1
<a name="deserialization-diffs-list-obj-to-req-param"></a>

O SDK para Java v1.x e v2.x diferem na forma como desserializam respostas JSON com listas e mapas vazios.

Quando o SDK recebe uma resposta com uma propriedade ausente que está modelada como uma lista ou mapa, a V1 desserializa essa propriedade ausente como `null`, enquanto a V2 desserializa a propriedade como um objeto de coleção vazia e imutável.

Por exemplo, considere a resposta retornada para o método `describeTable` de um cliente do DynamoDB. O método de exemplo a seguir contém um cliente da V2 do DynamoDB e um cliente da V1 do DynamoDB que executam o método `describeTable` em uma tabela que não tem índices secundários globais.

**Example da desserialização de uma propriedade modelada como uma lista que está faltando na resposta**  

```
public void deserializationDiffs(){

    DescribeTableResponse v2Response = dynamoDbClientV2.describeTable(builder -> builder.tableName(TABLE_NAME));
    // V2 provides has* methods on model objects for list/map members. No null check needed.
    LOGGER.info( String.valueOf(v2Response.table().hasGlobalSecondaryIndexes()) );
    LOGGER.info( String.valueOf(v2Response.table().globalSecondaryIndexes().isEmpty()) );
    // V2 deserialize to an empty collection.
    LOGGER.info(v2Response.table().globalSecondaryIndexes().toString());

    // V1 deserialize to null.
    DescribeTableResult v1Result = dynamoDbClientV1.describeTable(new DescribeTableRequest(TABLE_NAME));
    if (v1Result.getTable().getGlobalSecondaryIndexes() != null){
        LOGGER.info(v1Result.getTable().getGlobalSecondaryIndexes().toString());
    } else {
        LOGGER.info("The list of global secondary indexes returned by the V1 call is <null>");
    }
}
```
Esta é a saída registrada:  

```
INFO  org.example.DeserializationDifferences:45 - false
INFO  org.example.DeserializationDifferences:46 - true
INFO  org.example.DeserializationDifferences:48 - []
INFO  org.example.DeserializationDifferences:55 - The list of global secondary indexes returned by the V1 call is <null>
```

O Java SDK 2.x adota uma abordagem idiomática ao desserializar listas e mapas vazios em coleções vazias e imutáveis em vez de retornar `null`, promovendo um código mais seguro e conciso. Com a V2, você pode verificar se um serviço retornou um atributo modelado como uma lista ou mapa com o método `has*`, como o `hasGlobalSecondaryIndexes`, mostrado no exemplo anterior.

Essa abordagem evita a necessidade de verificações `null` explícitas e se alinha às práticas recomendadas modernas de Java para lidar com estruturas de dados ausentes ou vazias.

### Exemplo completo
<a name="full-example-deserialization"></a>

```
package org.example;

import com.amazonaws.regions.Regions;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;
import com.amazonaws.services.dynamodbv2.model.DescribeTableRequest;
import com.amazonaws.services.dynamodbv2.model.DescribeTableResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import software.amazon.awssdk.services.dynamodb.DynamoDbClient;
import software.amazon.awssdk.services.dynamodb.model.BillingMode;
import software.amazon.awssdk.services.dynamodb.model.DescribeTableResponse;
import software.amazon.awssdk.services.dynamodb.model.KeyType;
import software.amazon.awssdk.services.dynamodb.model.ScalarAttributeType;

import java.util.UUID;

public class DeserializationDifferences {
    private static final Logger LOGGER = LoggerFactory.getLogger(DeserializationDifferences.class);
    private static final String TABLE_NAME = "DeserializationTable-" + UUID.randomUUID();
    DynamoDbClient dynamoDbClientV2 = DynamoDbClient.create();
    AmazonDynamoDB dynamoDbClientV1 = AmazonDynamoDBClientBuilder.standard().withRegion(Regions.US_EAST_1).build();

    public static void main(String[] args) {

        DeserializationDifferences difference = new DeserializationDifferences();
        difference.createTable();
        difference.deserializationDiffs();
        difference.deleteTable();
    }

    public void createTable(){
        dynamoDbClientV2.createTable(b -> b
                .billingMode(BillingMode.PAY_PER_REQUEST)
                .tableName(TABLE_NAME)
                .keySchema(b1 -> b1.attributeName("Id").keyType(KeyType.HASH))
                .attributeDefinitions(b2 -> b2.attributeName("Id").attributeType(ScalarAttributeType.S)));
        dynamoDbClientV2.waiter().waitUntilTableExists(b -> b.tableName(TABLE_NAME));
    }

    public void deserializationDiffs(){

        DescribeTableResponse v2Response = dynamoDbClientV2.describeTable(builder -> builder.tableName(TABLE_NAME));
        // V2 provides has* methods on model objects for list/map members. No null check needed.
        LOGGER.info( String.valueOf(v2Response.table().hasGlobalSecondaryIndexes()) );
        LOGGER.info( String.valueOf(v2Response.table().globalSecondaryIndexes().isEmpty()) );
        // V2 deserialize to an empty collection.
        LOGGER.info(v2Response.table().globalSecondaryIndexes().toString());

        // V1 deserialize to null.
        DescribeTableResult v1Result = dynamoDbClientV1.describeTable(new DescribeTableRequest(TABLE_NAME));
        if (v1Result.getTable().getGlobalSecondaryIndexes() != null){
            LOGGER.info(v1Result.getTable().getGlobalSecondaryIndexes().toString());
        } else {
            LOGGER.info("The list of global secondary indexes returned by the V1 call is <null>");
        }
    }

    public void deleteTable(){
        dynamoDbClientV2.deleteTable(b -> b.tableName(TABLE_NAME));
        dynamoDbClientV2.waiter().waitUntilTableNotExists(b -> b.tableName(TABLE_NAME));
    }
}
```

A resposta JSON para o método `describeTable` do cliente da V1 e V2 não contém nenhum atributo `GlobalSecondaryIndexes`:

```
{
  "Table": {
    "AttributeDefinitions": [
      {
        "AttributeName": "Id",
        "AttributeType": "S"
      }
    ],
    "BillingModeSummary": {
      "BillingMode": "PAY_PER_REQUEST",
      "LastUpdateToPayPerRequestDateTime": ...
    },
    "CreationDateTime": ...,
    "DeletionProtectionEnabled": false,
    "ItemCount": 0,
    "KeySchema": [
      {
        "AttributeName": "Id",
        "KeyType": "HASH"
      }
    ],
    "ProvisionedThroughput": {
      "NumberOfDecreasesToday": 0,
      "ReadCapacityUnits": 0,
      "WriteCapacityUnits": 0 
    },
    "TableArn": "arn:aws:dynamodb:us-east-1:11111111111:table/DeserializationTable-...",
    "TableId": "...",
    "TableName": "DeserializationTable-...",
    "TableSizeBytes": 0,
    "TableStatus": "ACTIVE",
    "TableThroughputModeSummary": {
      "LastUpdateToPayPerRequestDateTime": ...,
      "TableThroughputMode": "PAY_PER_REQUEST"
    },
    "WarmThroughput": {
      "ReadUnitsPerSecond": 12000,
      "Status": "ACTIVE",
      "WriteUnitsPerSecond": 4000
    }
  }
}
```

# Alterações na exceção
<a name="migration-exception-changes"></a>

Os nomes de classes de exceção e suas estruturas e relacionamentos também foram alterados. `software.amazon.awssdk.core.exception.SdkException` é a nova classe `Exception` de base da qual todas as outras exceções derivam.

Esta tabela mapeia as alterações no nome da classe de exceção.


| 1.x | 2.x | 
| --- | --- | 
|   `com.amazonaws.SdkBaseException` `com.amazonaws.AmazonClientException`   |   `software.amazon.awssdk.core.exception.SdkException`   | 
|   `com.amazonaws.SdkClientException`   |   `software.amazon.awssdk.core.exception.SdkClientException`   | 
|   `com.amazonaws.AmazonServiceException`   |   `software.amazon.awssdk.awscore.exception.AwsServiceException`   | 

A tabela a seguir mapeia os métodos em classes de exceção entre a versão 1.x e a 2.x.


| 1.x | 2.x | 
| --- | --- | 
|   `AmazonServiceException.getRequestId`   |   `SdkServiceException.requestId`   | 
|   `AmazonServiceException.getServiceName`   |   `AwsServiceException.awsErrorDetails().serviceName`   | 
|   `AmazonServiceException.getErrorCode`   |   `AwsServiceException.awsErrorDetails().errorCode`   | 
|   `AmazonServiceException.getErrorMessage`   |   `AwsServiceException.awsErrorDetails().errorMessage`   | 
|   `AmazonServiceException.getStatusCode`   |   `AwsServiceException.awsErrorDetails().sdkHttpResponse().statusCode`   | 
|   `AmazonServiceException.getHttpHeaders`   |   `AwsServiceException.awsErrorDetails().sdkHttpResponse().headers`   | 
|   `AmazonServiceException.rawResponse`   |   `AwsServiceException.awsErrorDetails().rawResponse`   | 

# Alterações específicas do serviço
<a name="migration-service-changes"></a>

## Alterações no Amazon S3
<a name="s3-operations-name"></a>

O SDK para Java 2.x desabilita o acesso anônimo por padrão. Como resultado, você deve habilitar o acesso anônimo usando o `AnonymousCredentialsProvider`.

### Alterações no nome da operação
<a name="s3-op-name-changes"></a>

Muitos dos nomes de operação para o cliente do Amazon S3 foram alterados no AWS SDK para Java 2.x. Na versão 1.x, o cliente do Amazon S3 não é gerado diretamente da API de serviço. Isso resulta em inconsistência entre as operações do SDK e API de serviço. Na versão 2.x, agora geramos o cliente do Amazon S3 para ser mais consistente com a API de serviço.

A tabela a seguir mostra os nomes das operações nas duas versões.


**Nomes da operação do Amazon S3**  

| 1.x | 2.x | 
| --- | --- | 
| abortMultipartUpload | abortMultipartUpload | 
| changeObjectStorageClass  | copyObject | 
| completeMultipartUpload  | completeMultipartUpload | 
| copyObject | copyObject | 
| copyPart | uploadPartCopy | 
| createBucket | createBucket | 
| deleteBucket | deleteBucket | 
| deleteBucketAnalyticsConfiguration | deleteBucketAnalyticsConfiguration | 
| deleteBucketCrossOriginConfiguration | deleteBucketCors | 
| deleteBucketEncryption | deleteBucketEncryption | 
| deleteBucketInventoryConfiguration | deleteBucketInventoryConfiguration | 
| deleteBucketLifecycleConfiguration | deleteBucketLifecycle | 
| deleteBucketMetricsConfiguration | deleteBucketMetricsConfiguration | 
| deleteBucketPolicy | deleteBucketPolicy | 
| deleteBucketReplicationConfiguration | deleteBucketReplication | 
| deleteBucketTaggingConfiguration | deleteBucketTagging | 
| deleteBucketWebsiteConfiguration | deleteBucketWebsite | 
| deleteObject | deleteObject | 
| deleteObjectTagging | deleteObjectTagging | 
| deleteObjects | deleteObjects | 
| deleteVersion | deleteObject | 
| disableRequesterPays | putBucketRequestPayment | 
| doesBucketExist | headBucket | 
| doesBucketExistV2 | headBucket | 
| doesObjectExist | headObject | 
| enableRequesterPays | putBucketRequestPayment | 
| generatePresignedUrl | [S3Presigner](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/s3/presigner/S3Presigner.html) | 
| getBucketAccelerateConfiguration | getBucketAccelerateConfiguration | 
| getBucketAcl | getBucketAcl | 
| getBucketAnalyticsConfiguration | getBucketAnalyticsConfiguration | 
| getBucketCrossOriginConfiguration | getBucketCors | 
| getBucketEncryption | getBucketEncryption | 
| getBucketInventoryConfiguration | getBucketInventoryConfiguration | 
| getBucketLifecycleConfiguration | getBucketLifecycle ou getBucketLifecycleConfiguration | 
| getBucketLocation | getBucketLocation | 
| getBucketLoggingConfiguration | getBucketLogging | 
| getBucketMetricsConfiguration | getBucketMetricsConfiguration | 
| getBucketNotificationConfiguration | getBucketNotification ou getBucketNotificationConfiguration | 
| getBucketPolicy | getBucketPolicy | 
| getBucketReplicationConfiguration | getBucketReplication | 
| getBucketTaggingConfiguration | getBucketTagging | 
| getBucketVersioningConfiguration | getBucketVersioning | 
| getBucketWebsiteConfiguration | getBucketWebsite | 
| getObject | getObject | 
| getObjectAcl | getObjectAcl | 
| getObjectAsString | getObjectAsBytes().asUtf8String | 
| getObjectMetadata | headObject | 
| getObjectTagging | getObjectTagging | 
| getResourceUrl | [https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/s3/S3Utilities.html#getUrl(java.util.function.Consumer)](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/s3/S3Utilities.html#getUrl(java.util.function.Consumer)) | 
| getS3AccountOwner | listBuckets | 
| getUrl | [S3Utilities\$1getUrl](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/s3/S3Utilities.html#getUrl(java.util.function.Consumer)) | 
| headBucket | headBucket | 
| initiateMultipartUpload | createMultipartUpload | 
| isRequesterPaysEnabled | getBucketRequestPayment | 
| listBucketAnalyticsConfigurations | listBucketAnalyticsConfigurations | 
| listBucketInventoryConfigurations | listBucketInventoryConfigurations | 
| listBucketMetricsConfigurations | listBucketMetricsConfigurations | 
| listBuckets | listBuckets | 
| listMultipartUploads | listMultipartUploads | 
| listNextBatchOfObjects | listObjectsV2Paginator | 
| listNextBatchOfVersions | listObjectVersionsPaginator | 
| listObjects | listObjects | 
| listObjectsV2 | listObjectsV2 | 
| listParts | listParts | 
| listVersions | listObjectVersions | 
| putObject | putObject | 
| restoreObject | restoreObject | 
| restoreObjectV2 | restoreObject | 
| selectObjectContent | selectObjectContent | 
| setBucketAccelerateConfiguration | putBucketAccelerateConfiguration | 
| setBucketAcl | putBucketAcl | 
| setBucketAnalyticsConfiguration | putBucketAnalyticsConfiguration | 
| setBucketCrossOriginConfiguration | putBucketCors | 
| setBucketEncryption | putBucketEncryption | 
| setBucketInventoryConfiguration | putBucketInventoryConfiguration | 
| setBucketLifecycleConfiguration | putBucketLifecycle ou putBucketLifecycleConfiguration | 
| setBucketLoggingConfiguration | putBucketLogging | 
| setBucketMetricsConfiguration | putBucketMetricsConfiguration | 
| setBucketNotificationConfiguration | putBucketNotification ou putBucketNotificationConfiguration | 
| setBucketPolicy | putBucketPolicy | 
| setBucketReplicationConfiguration | putBucketReplication | 
| setBucketTaggingConfiguration | putBucketTagging | 
| setBucketVersioningConfiguration | putBucketVersioning | 
| setBucketWebsiteConfiguration | putBucketWebsite | 
| setObjectAcl | putObjectAcl | 
| setObjectRedirectLocation | copyObject | 
| setObjectTagging | putObjectTagging | 
| uploadPart | uploadPart | 

## Alterações no Amazon SNS
<a name="sns-changes"></a>

Um cliente do SNS não pode mais acessar tópicos do SNS em regiões diferentes daquela para a qual ele está configurado para acessar.

## Alterações no Amazon SQS
<a name="sqs-changes"></a>

Um cliente do SQS não pode mais acessar filas do SQS em regiões diferentes daquela para a qual ele está configurado para acessar.

## Alterações no Amazon RDS
<a name="rds-changes"></a>

O SDK para Java 2.x usa `RdsUtilities#generateAuthenticationToken` no lugar da classe `RdsIamAuthTokenGenerator` em 1.x.

# Mudanças no trabalho com o Amazon S3 da versão 1 para a versão 2 do AWS SDK para Java
<a name="migration-s3"></a>

Isso AWS SDK for Java 2.x introduz mudanças significativas no cliente S3, incluindo uma nova estrutura de pacotes, nomes de classes atualizados e assinaturas de métodos revisadas. Embora muitos métodos possam ser migrados automaticamente da V1 para a V2 usando a [ferramenta de migração](migration-tool.md), alguns exigem migração manual, como `listNextBatchOfObjects` e `selectObjectContent`. Além disso, a V2 substitui certas classes da V1, como `AccessControlList` e `CannedAccessControlList` por novas implementações.

**Topics**
+ [

# Diferenças do cliente S3 entre a versão 1 e a versão 2 do AWS SDK para Java
](migration-s3-client.md)
+ [

# Migre o Transfer Manager da versão 1 para a versão 2 do AWS SDK para Java
](migration-s3-transfer-manager.md)
+ [

# Alterações na análise do Amazon URIs S3 da versão 1 para a versão 2
](migration-s3-uri-parser.md)
+ [

# Alterações na API de Notificações de Eventos do S3 da versão 1 para a versão 2
](migration-s3-event-notification.md)

# Diferenças do cliente S3 entre a versão 1 e a versão 2 do AWS SDK para Java
<a name="migration-s3-client"></a>

Neste tópico, as diferenças entre os clientes do S3 na versão 1 e na versão 2 do SDK para Java são organizadas de acordo com a forma como a [ferramenta de migração](migration-tool.md) pode automatizar a migração. A ferramenta permite a migração da maioria dos métodos da V1 para a V2, mas alguns métodos exigem a migração manual. Além dos métodos de cliente do S3, algumas classes da V1 do S3 não têm um equivalente direto na V2, exigindo migração manual.

**Contents**
+ [

## Exemplo de métodos da V1 compatíveis com a ferramenta de migração
](#methods-tool-migration)
  + [

### `putObject`
](#V1-V2-putobject)
  + [

### `getObject`
](#V1-V2-getobject)
+ [

## Métodos da V1 que exigem migração manual
](#s3-methods-manual-migration)
  + [`getObject` usando `S3ObjectId`](#V1s-getObject-using-V1s-S3ObjectId)
  + [`getETag` usando `ObjectMetadata`](#V1s-ObjectMetadata-using-V1s-getETag)
  + [`listNextBatchOfObjects`](#V1-listNextBatchOfObjects)
  + [`listNextBatchOfVersions`](#V1-listNextBatchOfVersions)
  + [

### `selectObjectContent`
](#V1-selectObjectContent)
  + [`setBucketAcl`](#V1-setBucketAcl)
  + [`setObjectAcl`](#V1-setObjectAcl)
  + [`initiateMultipartUpload`](#V1-initiateMultipartUpload)
    + [

#### Exemplo de migração
](#V1-initiateMultipartUpload-migration-ex)
    + [

#### Diferenças de implementação
](#V1-initiateMultipartUpload-impl-diffs)
  + [`setRegion`](#V1-setRegion)
  + [`setS3ClientOptions(S3ClientOptions clientOptions)`](#V1-setS3ClientOptions)
  + [`setBucketLoggingConfiguration`](#V1-setBucketLoggingConfiguration)
  + [`setBucketLifecycleConfiguration`](#V1-setBucketLifecycleConfiguration)
  + [`setBucketTaggingConfiguration`](#V1-setBucketTaggingConfiguration)
+ [

## Classes da V1 que exigem migração manual
](#s3-classes-manual-migration)
  + [`AccessControlList`](#V1-AccessControlList)
  + [`CannedAccessControlList`](#V1-CannedAccessControlList)
  + [`BucketNotificationConfiguration`](#V1-BucketNotificationConfiguration)
  + [`MultiFactorAuthentication`](#V1-MultifactorAuthentication)

## Exemplo de métodos da V1 compatíveis com a ferramenta de migração
<a name="methods-tool-migration"></a>

A ferramenta de migração migra automaticamente a maioria dos métodos da V1 para a V2. Os métodos `putObject` e `getObject` são dois exemplos.

### `putObject`
<a name="V1-V2-putobject"></a>

```
// SDK V1
s3Client.putObject("amzn-s3-demo-bucket", "my-key", "Hello World!");


// SDK V2
s3Client.putObject(req -> req 
    .bucket("amzn-s3-demo-bucket") 
    .key("my-key"), 
    RequestBody.fromString("Hello World!"));
```

### `getObject`
<a name="V1-V2-getobject"></a>

```
// SDK V1
S3Object object = s3Client.getObject("amzn-s3-demo-bucket", "my-key");
InputStream content = object.getObjectContent();


// SDK V2
ResponseInputStream<GetObjectResponse> response = s3Client.getObject(req -> req 
    .bucket("amzn-s3-demo-bucket") 
    .key("my-key"));
```

## Métodos da V1 que exigem migração manual
<a name="s3-methods-manual-migration"></a>

Você precisa migrar manualmente os seguintes métodos de cliente do S3 na V1. Ao usar a ferramenta de migração, você vê um comentário no arquivo Java de saída da V2 que direciona para esse tópico.

### `getObject` da V1 usa `S3ObjectId` da V1 para `GetObjectRequest.builder()` da V2
<a name="V1s-getObject-using-V1s-S3ObjectId"></a>

```
// SDK V1
AmazonS3 s3ClientV1 = AmazonS3ClientBuilder.standard()
        .withRegion(Regions.US_WEST_2)
        .build();

S3ObjectId s3ObjectId = new S3ObjectId(
    "amzn-s3-demo-bucket",
    "object-key",
    "abc123version" 
);

GetObjectRequest getRequest= new GetObjectRequest(s3ObjectId);
S3Object s3ObjectVersioned = s3Client.getObject(getRequest);


// SDK V2
// V2 does not include a 'S3ObjectId' class. V2 uses the request builder pattern 
// to supply the bucket, key, and version parameters.
S3Client s3Client = S3Client.builder()
    .region(Region.US_WEST_2)
    .build();

GetObjectRequest getRequest = GetObjectRequest.builder()
    .bucket("amzn-s3-demo-bucket")
    .key("object-key")
    .versionId("abc123version")
    .build();

ResponseInputStream<GetObjectResponse> response = s3Client.getObject(getRequest);
```

### `getETag()` da V1 usa `ObjectMetadata` da V1 para `GetObjectResponse.eTag()` da V2
<a name="V1s-ObjectMetadata-using-V1s-getETag"></a>

```
// SDK V1
AmazonS3 s3ClientV1 = AmazonS3ClientBuilder.standard()
    .withRegion(Regions.US_WEST_2)
    .build();

S3Object object = s3ClientV1.getObject("amzn-s3-demo-bucket", "my-key");

// Double quotes are removed by the S3 client.
System.out.println(object.getObjectMetadata().getETag());

// SDK V2
S3Client s3ClientV2 = S3Client.builder()
        .region(Region.US_WEST_2)
        .build();

ResponseInputStream<GetObjectResponse> response = s3ClientV2.getObject(
        req -> req.bucket("amzn-s3-demo-bucket").key("my-key"));

// Double quotes are *NOT* removed. This is the unchanged ETag value as S3 sent it.
System.out.println(response.response().eTag());
```

### `listNextBatchOfObjects` da V1 para `listObjectsV2Paginator` da V2
<a name="V1-listNextBatchOfObjects"></a>

```
// SDK V1
AmazonS3 s3ClientV1 = AmazonS3ClientBuilder.standard()
    .withRegion(Regions.US_WEST_2)
    .build();

ObjectListing objectListing = s3ClientV1.listObjects("bucket-name");
while (objectListing.isTruncated()) {
    objectListing = s3ClientV1.listNextBatchOfObjects(objectListing);
    for (S3ObjectSummary summary : objectListing.getObjectSummaries()) {
        System.out.println(summary.getKey());
    }
}


// SDK V2
S3Client s3ClientV2 = S3Client.builder()
    .region(Region.US_WEST_2)
    .build();

ListObjectsV2Request request = ListObjectsV2Request.builder()
    .bucket("bucket-name")
    .build();

// V2 returns a paginator.
ListObjectsV2Iterable responses = s3Client.listObjectsV2Paginator(request);

for (ListObjectsV2Response page : responses) {
    page.contents().forEach(content -> {
        System.out.println(content.key());
    });
}
```

### `listNextBatchOfVersions` da V1 para `listObjectVersionsPaginator` da V2
<a name="V1-listNextBatchOfVersions"></a>

```
// SDK V1
AmazonS3 s3ClientV1 = AmazonS3ClientBuilder.standard()
    .withRegion(Regions.US_WEST_2)
    .build();

VersionListing versionListing = s3ClientV1.listVersions("bucket-name", "prefix");
while (versionListing.isTruncated()) {
    versionListing = s3ClientV1.listNextBatchOfVersions(versionListing);
    for (S3VersionSummary version : versionListing.getVersionSummaries()) {
        System.out.println(version.getKey() + " " + version.getVersionId());
    }
}


// SDK V2
S3Client s3ClientV2 = S3Client.builder()
    .region(Region.US_WEST_2)
    .build();

ListObjectVersionsRequest request = ListObjectVersionsRequest.builder()
    .bucket("bucket-name")
    .prefix("prefix")
    .build();

// V2 returns a paginator.
ListObjectVersionsIterable responses = s3ClientV2.listObjectVersionsPaginator(request);

for (ListObjectVersionsResponse page : responses) {
    page.versions().forEach(version -> {
        System.out.println(version.key() + " " + version.versionId());
    });
}
```

### `selectObjectContent`
<a name="V1-selectObjectContent"></a>

```
// SDK V1
AmazonS3 s3ClientV1 = AmazonS3ClientBuilder.standard()
    .withRegion(Regions.US_WEST_2)
    .build();

SelectObjectContentRequest request = new SelectObjectContentRequest()
    .withBucket("bucket-name")
    .withKey("object-key")
    .withExpression("select * from S3Object")
    .withExpressionType(ExpressionType.SQL)
 

SelectObjectContentResult result = s3ClientV1.selectObjectContent(request);
InputStream resultInputStream = result.getPayload().getRecordsInputStream();


// SDK V2
// In V2, 'selectObjectContent()' is available only on the S3AsyncClient. 
// V2 handles responses using an event-based 'SelectObjectContentEventStream'.
S3AsyncClient s3ClientV2 = S3AsyncClient.builder()
    .region(Region.US_WEST_2)
    .build();

SelectObjectContentRequest request = SelectObjectContentRequest.builder()
    .bucket("bucket-name")
    .key("object-key")
    .expression("select * from S3Object")
    .expressionType(ExpressionType.SQL)
    .build();
    
SelectObjectContentResponseHandler handler = new SelectObjectContentResponseHandler() {
    // Implement the required abstract methods such as 'onEventStream()'.
};

CompletableFuture<Void> future = s3ClientV2.selectObjectContent(request, handler);
// The 'SelectObjectContentResponseHandler' implementation processes the results.
```

### Método `setBucketAcl` da V1 para `acl` da V2 no `PutBucketAclRequest.builder()`
<a name="V1-setBucketAcl"></a>

```
// SDK V1
AmazonS3 s3ClientV1 = AmazonS3ClientBuilder.standard()
    .withRegion(Regions.US_WEST_2)
    .build();

AccessControlList acl = new AccessControlList();
acl.grantPermission(GroupGrantee.AllUsers, Permission.Read);
s3ClientV1.setBucketAcl("bucket-name", acl);


// SDK V2
S3Client s3ClientV2 = S3Client.builder()
    .region(Region.US_WEST_2)
    .build();

PutBucketAclRequest request = PutBucketAclRequest.builder()
    .bucket("bucket-name")
    .acl(BucketCannedACL.PRIVATE)
    .build();

s3ClientV2.putBucketAcl(request);
```

### Método `setObjectAcl` da V1 para `acl` da V2 no `PutObjectAclRequest.builder()`
<a name="V1-setObjectAcl"></a>

```
// SDK V1
AmazonS3 s3ClientV1 = AmazonS3ClientBuilder.standard()
    .withRegion(Regions.US_WEST_2)
    .build();

AccessControlList acl = new AccessControlList();
acl.grantPermission(GroupGrantee.AllUsers, Permission.Read);
s3ClientV1.setObjectAcl("bucket-name", "object-key", acl);


// SDK V2
S3Client s3ClientV2 = S3Client.builder()
    .region(Region.US_WEST_2)
    .build();

PutObjectAclRequest request = PutObjectAclRequest.builder()
    .bucket("bucket-name")
    .key("object-key")
    .acl(ObjectCannedACL.PRIVATE)
    .build();

s3ClientV2.putObjectAcl(request);
```

### `initiateMultipartUpload` da V1 para `createMultipartUpload` da V2
<a name="V1-initiateMultipartUpload"></a>

#### Exemplo de migração
<a name="V1-initiateMultipartUpload-migration-ex"></a>

```
// SDK V1
AmazonS3 s3ClientV1 = AmazonS3ClientBuilder.standard()
    .withRegion(Regions.US_WEST_2)
    .build();
    
ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentType("application/zip");
metadata.addUserMetadata("mykey", "myvalue");

InitiateMultipartUploadRequest initRequest = new InitiateMultipartUploadRequest(
    "bucket-name", 
    "object-key",
    metadata
);

InitiateMultipartUploadResult initResponse = s3ClientV1.initiateMultipartUpload(initRequest);
String uploadId = initResponse.getUploadId();


// SDK V2
// V1 uses ObjectMetadata methods, whereas V2 uses a simple Map.
S3Client s3ClientV2 = S3Client.builder()
    .region(Region.US_WEST_2)
    .build();

CreateMultipartUploadRequest createMultipartRequest = CreateMultipartUploadRequest.builder() 
    .bucket("amzn-s3-demo-bucket") 
    .key("object-key") 
    .contentType("application/zip") 
    .metadata(Collections.singletonMap("mykey", "myvalue"))
    .build();

CreateMultipartUploadResponse response = s3ClientV2.createMultipartUpload(createMultipartRequest);
String uploadId = response.uploadId();
```

#### Diferenças de implementação
<a name="V1-initiateMultipartUpload-impl-diffs"></a>

O valor do cabeçalho padrão `Content-Type` para os métodos a seguir varia conforme mostrado na tabela a seguir.


****  

| Versão do SDK | Método | Valor padrão `Content-Type` | 
| --- | --- | --- | 
| versão 1 | [initiateMultipartUpload](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/AmazonS3Client.html#initiateMultipartUpload-com.amazonaws.services.s3.model.InitiateMultipartUploadRequest-) | application/octet-stream | 
| version 2 | [createMultipartUpload](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/s3/S3AsyncClient.html#createMultipartUpload(software.amazon.awssdk.services.s3.model.CreateMultipartUploadRequest)) | binary/octet-stream | 

### Método de `setRegion` da V1 para `region` da V2 no compilador de cliente
<a name="V1-setRegion"></a>

```
// SDK V1
AmazonS3 s3ClientV1 = AmazonS3ClientBuilder.standard().build();
s3ClientV1.setRegion(Region.getRegion(Regions.US_WEST_2));


// SDK V2
S3Client s3ClientV2 = S3Client.builder()
    .region(Region.US_WEST_2)
    .build();
```

### `setS3ClientOptions(S3ClientOptions clientOptions)` da V1
<a name="V1-setS3ClientOptions"></a>

Em vez de usar um único objeto `S3ClientOptions` com o método `setS3ClientOptions`, a V2 fornece métodos no compilador de cliente para definir opções.

### `setBucketLoggingConfiguration` da V1 para `putBucketLogging` da V2
<a name="V1-setBucketLoggingConfiguration"></a>

```
// SDK V1
AmazonS3 s3ClientV1 = AmazonS3ClientBuilder.standard()
    .withRegion(Regions.US_WEST_2)
    .build();

BucketLoggingConfiguration loggingConfig = new BucketLoggingConfiguration();
loggingConfig.setDestinationBucketName("log-bucket");

SetBucketLoggingConfigurationRequest request = new SetBucketLoggingConfigurationRequest(
    "amzn-s3-demo-source-bucket",
    loggingConfig
);

s3ClientV1.setBucketLoggingConfiguration(request);


// SDK V2
// In V2, V1's 'BucketLoggingConfiguration' is replaced by 'BucketLoggingStatus' 
// and 'LoggingEnabled'.
S3Client s3ClientV2 = S3Client.builder()
    .region(Region.US_WEST_2)
    .build();

LoggingEnabled loggingEnabled = LoggingEnabled.builder()
    .targetBucket("log-bucket")
    .build();

BucketLoggingStatus loggingStatus = BucketLoggingStatus.builder()
    .loggingEnabled(loggingEnabled)
    .build();

PutBucketLoggingRequest request = PutBucketLoggingRequest.builder()
    .bucket("amzn-s3-demo-source-bucket")
    .bucketLoggingStatus(loggingStatus)
    .build();

s3ClientV2.putBucketLogging(request);
```

### `setBucketLifecycleConfiguration` da V1 para `putBucketLifecycleConfiguration` da V2
<a name="V1-setBucketLifecycleConfiguration"></a>

```
// SDK V1
BucketLifecycleConfiguration.Rule rule = new BucketLifecycleConfiguration.Rule()
    .withId("Archive and Delete Rule")
    .withPrefix("documents/")
    .withStatus(BucketLifecycleConfiguration.ENABLED)
    .withTransitions(Arrays.asList(
        new Transition()
            .withDays(30)
            .withStorageClass(StorageClass.StandardInfrequentAccess.toString()),
        new Transition()
            .withDays(90)
            .withStorageClass(StorageClass.Glacier.toString())
    ))
    .withExpirationInDays(365);

BucketLifecycleConfiguration configuration = new BucketLifecycleConfiguration()
    .withRules(Arrays.asList(rule));

s3ClientV1.setBucketLifecycleConfiguration("amzn-s3-demo-bucket", configuration);


// SDK V2
LifecycleRule rule = LifecycleRule.builder()
    .id("Archive and Delete Rule")
    .filter(LifecycleRuleFilter.builder()
        .prefix("documents/")
        .build())
    .status(ExpirationStatus.ENABLED)
    .transitions(Arrays.asList(
        Transition.builder()
            .days(30)
            .storageClass(TransitionStorageClass.STANDARD_IA)
            .build(),
        Transition.builder()
            .days(90)
            .storageClass(TransitionStorageClass.GLACIER)
            .build()
    ))
    .expiration(LifecycleExpiration.builder()
        .days(365)
        .build())
    .build();

PutBucketLifecycleConfigurationRequest request = PutBucketLifecycleConfigurationRequest.builder()
    .bucket("amzn-s3-demo-bucket")
    .lifecycleConfiguration(BucketLifecycleConfiguration.builder()
        .rules(rule)
        .build())
    .build();

s3ClientV2.putBucketLifecycleConfiguration(request);
```

### `setBucketTaggingConfiguration` da V1 para `putBucketTagging` da V2
<a name="V1-setBucketTaggingConfiguration"></a>

```
// SDK V1
List<TagSet> tagsets = new ArrayList<>();
TagSet tagSet = new TagSet();
tagSet.setTag("key1", "value1");
tagSet.setTag("key2", "value2");
tagsets.add(tagSet);

BucketTaggingConfiguration bucketTaggingConfiguration = new BucketTaggingConfiguration();
bucketTaggingConfiguration.setTagSets(tagsets);

SetBucketTaggingConfigurationRequest request = new SetBucketTaggingConfigurationRequest(
    "amzn-s3-demo-bucket",
    bucketTaggingConfiguration
);

s3ClientV1.setBucketTaggingConfiguration(request);


// SDK V2
Tagging tagging = Tagging.builder()
    .tagSet(Arrays.asList(
        Tag.builder()
            .key("key1")
            .value("value1")
            .build(),
        Tag.builder()
            .key("key2")
            .value("value2")
            .build()
    ))
    .build();

PutBucketTaggingRequest request = PutBucketTaggingRequest.builder()
    .bucket("amzn-s3-demo-bucket")
    .tagging(tagging)
    .build();

s3ClientV2.putBucketTagging(request);
```

## Classes da V1 que exigem migração manual
<a name="s3-classes-manual-migration"></a>

### `AccessControlList` da V1 para `AccessControlPolicy` da V2
<a name="V1-AccessControlList"></a>

```
// SDK V1
AccessControlList aclV1 = new AccessControlList();
aclV1.setOwner(new Owner("owner-id", "owner-name"));
aclV1.grantPermission(GroupGrantee.AllUsers, Permission.Read);

// SDK V2
// To migrate from V1 to V2, replace direct 'AccessControlList' modifications with an
// 'AccessControlPolicy.builder()' that contains both owner information and grants. 
// Note that V2's approach requires building the complete permission set upfront rather than modifying permissions incrementally.
AccessControlPolicy acpV2 = AccessControlPolicy.builder()
    .owner(Owner.builder()
        .id("owner-id")
        .displayName("owner-name")
        .build())
    .grants(Arrays.asList(
         Grant.builder()
            .grantee(Grantee.builder()
                 .type(Type.GROUP)
                 .uri("http://acs.amazonaws.com/groups/global/AllUsers") 
                 .build())
             .permission(Permission.READ)
             .build()
     ))
     .build();
```

### Enumeração `CannedAccessControlList` da V1 para as enumerações `BucketCannedACL` e `ObjectCannedACL` da V2
<a name="V1-CannedAccessControlList"></a>

```
// SDK V1
// In V1, 'CannedAccessControlList' is an enumeration of predefined ACLs.
AmazonS3 s3ClientV1 = AmazonS3ClientBuilder.standard().build();

// Creating a bucket.
s3ClientV1.setBucketAcl("bucket-name", CannedAccessControlList.PublicRead);

// Creating an object.
PutObjectRequest putObjectRequest = new PutObjectRequest("bucket-name", "object-key", file)
    .withCannedAcl(CannedAccessControlList.PublicRead);
s3ClientV1.putObject(putObjectRequest);


// SDK V2
// V2 replaces V1's 'CannedAccessControlList' with 'BucketCannedACL' for buckets and 'ObjectCannedACL' for objects.
S3Client s3ClientV2 = S3Client.builder().build();

// Creating a bucket.
PutBucketAclRequest bucketRequest = PutBucketAclRequest.builder()
    .bucket("bucket-name")
    .acl(BucketCannedACL.PRIVATE)
    .build();
s3ClientV2.putBucketAcl(bucketRequest);

// Creating an object.
PutObjectRequest objectRequest = PutObjectRequest.builder()
    .bucket("bucket-name")
    .key("object-key")
    .acl(ObjectCannedACL.PUBLIC_READ)
    .build();
s3ClientV2.putObject(objectRequest, RequestBody.fromFile(file));
```

### `BucketNotificationConfiguration` da V1 para `NotificationConfiguration` da V2
<a name="V1-BucketNotificationConfiguration"></a>

```
//SDK V1
BucketNotificationConfiguration notificationConfig = new BucketNotificationConfiguration();

// Adding configurations by name
notificationConfig.addConfiguration("lambdaConfig", 
    new LambdaConfiguration("arn:aws:lambda:function", "s3:ObjectCreated:"));

notificationConfig.addConfiguration("topicConfig",
    new TopicConfiguration("arn:aws:sns:topic", "s3:ObjectRemoved:"));

notificationConfig.addConfiguration("queueConfig",
    new QueueConfiguration("arn:aws:sqs:queue", "s3:ObjectRestore:*"));

s3Client.setBucketNotificationConfiguration("bucket", notificationConfig);


// SDK V2
// In V2, V1's BucketNotificationConfiguration is renamed to NotificationConfiguration. 
// V2 contains no common abstract class for LambdaFunction/Topic/Queue configurations.
NotificationConfiguration notificationConfig = NotificationConfiguration.builder()
    .lambdaFunctionConfigurations(
        LambdaFunctionConfiguration.builder()
            .lambdaFunctionArn("arn:aws:lambda:function")
            .events(Event.valueOf("s3:ObjectCreated:"))
            .build())
    .topicConfigurations(
        TopicConfiguration.builder()
            .topicArn("arn:aws:sns:topic")
            .events(Event.valueOf("s3:ObjectRemoved:"))
            .build())
    .queueConfigurations(
        QueueConfiguration.builder()
            .queueArn("arn:aws:sqs:queue")
            .events(Event.valueOf("s3:ObjectRestore:*"))
            .build())
    .build();

s3Client.putBucketNotificationConfiguration(req -> req
    .bucket("bucket")
    .notificationConfiguration(notificationConfig));
```

### Método de `MultiFactorAuthentication` da V1 para `mfa` da V2 em um compilador de solicitações
<a name="V1-MultifactorAuthentication"></a>

```
// SDK V1
AmazonS3 s3ClientV1 = AmazonS3ClientBuilder.standard()
    .withRegion(Regions.US_WEST_2)
    .build();

BucketVersioningConfiguration versioningConfig = new BucketVersioningConfiguration()
    .withStatus(BucketVersioningConfiguration.ENABLED);

// Create an MFA configuration object.
MultiFactorAuthentication mfa = new MultiFactorAuthentication(
    "arn:aws:iam::1234567890:mfa/user",
    "123456"
);

// Create the request object.
SetBucketVersioningConfigurationRequest request = new SetBucketVersioningConfigurationRequest(
    "bucket-name",
    versioningConfig,
    mfa
);

// Send the request.
s3ClientV1.setBucketVersioningConfiguration(request);


// SDK V2
// V2 replaces V1's MultiFactorAuthentication POJO with parameters you set on the request builder.
S3Client s3ClientV2 = S3Client.builder()
    .region(Region.US_WEST_2)
    .build();

PutBucketVersioningRequest request = PutBucketVersioningRequest.builder()
    .bucket("bucket-name")
    .versioningConfiguration(VersioningConfiguration.builder()
        .status(BucketVersioningStatus.ENABLED)
        .build())
    .mfa("arn:aws:iam::1234567890:mfa/user 123456")  // Single method takes both MFA erial number and token.
    .build();

s3ClientV2.putBucketVersioning(request);
```

# Migre o Transfer Manager da versão 1 para a versão 2 do AWS SDK para Java
<a name="migration-s3-transfer-manager"></a>

Esse guia de migração aborda as principais diferenças entre o Gerenciador de Transferências v1 e o Gerenciador de Transferências v2 do S3, incluindo alterações no construtor, mapeamentos de métodos e exemplos de código para operações comuns. Depois de analisar essas diferenças, você pode migrar com êxito o código existente do Gerenciador de Transferências para aproveitar o desempenho aprimorado e as operações assíncronas na v2.

**Sobre a ferramenta de migração do AWS SDK**  
O AWS SDK para Java fornece uma [ferramenta de migração](migration-tool.md) automatizada que pode migrar grande parte da API do Transfer Manager v1 para a v2. No entanto, a ferramenta de migração não é compatível com vários recursos do Gerenciador de Transferências v1. Nesses casos, é preciso migrar manualmente o código do Gerenciador de Transferências de acordo com as orientações deste tópico.  
Ao longo deste guia, o **status da migração** mostra se a ferramenta de migração pode migrar automaticamente um construtor, método ou recurso:  
**Compatível**: a ferramenta de migração pode transformar automaticamente esse código
**Incompatível**: é preciso migrar o código manualmente
Mesmo para itens marcados com o status “Compatível”, analise os resultados da migração e faça um teste completo. A migração do Gerenciador de Transferências envolve mudanças de arquitetura significativas de operações síncronas para assíncronas.

## Visão geral do
<a name="s3-tm-migration-overview"></a>

O Gerenciador de Transferências do S3 v2 introduz mudanças significativas na API do Gerenciador de Transferências. O S3 Transfer Manager v2 é baseado em operações assíncronas e oferece melhor desempenho, especialmente quando você usa o cliente Amazon S3 baseado em CRT. AWS 

### Principais diferenças
<a name="s3-tm-migration-key-differences"></a>
+ **Pacote**: `com.amazonaws.services.s3.transfer` → `software.amazon.awssdk.transfer.s3`
+ **Nome da classe**: `TransferManager` → `S3TransferManager`
+ **Dependência do cliente**: cliente síncrono do Amazon S3 → cliente assíncrono do Amazon S3 (`S3AsyncClient`)
+ **Arquitetura**: operações síncronas → operações assíncronas com `CompletableFuture`
+ **Desempenho**: aprimorado com suporte ao cliente AWS baseado em CRT

## Alterações de alto nível
<a name="s3-tm-migration-high-level-changes"></a>


| Aspecto | V1 | V2 | 
| --- | --- | --- | 
| Dependência do Maven | aws-java-sdk-s3 | s3-transfer-manager | 
| Pacote | com.amazonaws.services.s3.transfer | software.amazon.awssdk.transfer.s3 | 
| Classe principal | TransferManager | S3TransferManager | 
| Cliente do Amazon S3 | AmazonS3 (síncrono) | S3AsyncClient (assíncrono) | 
| Tipos de retorno | Operações de bloqueio | CompletableFuture<T> | 

## Dependências do Maven
<a name="s3-tm-migration-dependencies"></a>


| V1 | V2 | 
| --- | --- | 
|  <pre><dependencyManagement><br />    <dependencies><br />        <dependency><br />            <groupId>com.amazonaws</groupId><br />            <artifactId>aws-java-sdk-bom</artifactId><br />            <version>>1.12.7871</version><br />            <type>pom</type><br />            <scope>import</scope><br />        </dependency><br />    </dependencies><br /></dependencyManagement><br /><dependencies><br />    <dependency><br />        <groupId>com.amazonaws</groupId><br />        <artifactId>aws-java-sdk-s3</artifactId><br />    </dependency><br /></dependencies></pre>  |  <pre><dependencyManagement><br />    <dependencies><br />        <dependency><br />            <groupId>software.amazon.awssdk</groupId><br />            <artifactId>bom</artifactId><br />            <version>2.31.682</version><br />            <type>pom</type><br />            <scope>import</scope><br />        </dependency><br />    </dependencies><br /></dependencyManagement><br /><dependencies><br />    <dependency><br />        <groupId>software.amazon.awssdk</groupId><br />        <artifactId>s3-transfer-manager</artifactId><br />    </dependency><br />    <!-- Optional: For enhanced performance with AWS CRT --><br />    <dependency><br />        <groupId>software.amazon.awssdk.crt</groupId><br />        <artifactId>aws-crt</artifactId><br />        <version>0.38.53</version><br />    </dependency><br /></dependencies></pre>  | 

1 [Versão mais recente](https://central.sonatype.com/artifact/com.amazonaws/aws-java-sdk-bom). 2 [Versão mais recente](https://central.sonatype.com/artifact/software.amazon.awssdk/bom). 3 [Versão mais recente](https://central.sonatype.com/artifact/software.amazon.awssdk.crt/aws-crt).

## Migração do construtor do cliente
<a name="s3-tm-migration-client-constructor"></a>

### Construtores compatíveis (migração automática)
<a name="s3-tm-migration-supported-constructors"></a>


| Construtor V1 | V2 equivalente | Status da migração | 
| --- | --- | --- | 
| new TransferManager() | S3TransferManager.create() | Compatível | 
| TransferManagerBuilder. defaultTransferManager() | S3TransferManager.create() | Compatível | 
| TransferManagerBuilder. standard().build() | S3TransferManager.builder().build() | Compatível | 
| new TransferManager(AWSCredentials) | S3TransferManager.builder() .s3Client(S3AsyncClient.builder() .credentialsProvider(...).build()) .build() | Compatível | 
| new TransferManager( AWSCredentialsProvider) | S3TransferManager.builder() .s3Client(S3AsyncClient.builder() .credentialsProvider(...).build()) .build() | Compatível | 

### Construtores incompatíveis (migração manual obrigatória)
<a name="s3-tm-migration-unsupported-constructors"></a>


| Construtor V1 | V2 equivalente | Notas de migração | 
| --- | --- | --- | 
| new TransferManager(AmazonS3) | Migração manual obrigatória | Criar um S3AsyncClient separadamente | 
| new TransferManager(AmazonS3, ExecutorService) | Migração manual obrigatória | Criar um S3AsyncClient e configurar um executor | 
| new TransferManager(AmazonS3, ExecutorService, boolean) | Migração manual obrigatória | Parâmetro shutDownThreadPools incompatível | 

### Exemplos de migração manual
<a name="s3-tm-migration-manual-examples"></a>

**Código da V1:**

```
AmazonS3 s3Client = AmazonS3ClientBuilder.defaultClient();
TransferManager transferManager = new TransferManager(s3Client);
```

**Código da V2:**

```
// Create an `S3AsyncClient` with similar configuration
S3AsyncClient s3AsyncClient = S3AsyncClient.builder()
    .credentialsProvider(DefaultCredentialsProvider.create())
    .build();

// Provide the configured `S3AsyncClient` to the S3 transfer manager builder.
S3TransferManager transferManager = S3TransferManager.builder()
    .s3Client(s3AsyncClient)
    .build();
```

## Migração do método do cliente
<a name="s3-tm-migration-client-methods"></a>

Atualmente, a ferramenta de migração é compatível com os métodos básicos `copy`, `download`, `upload`, `uploadDirectory`, `downloadDirectory`, `resumeDownload` e `resumeUpload`.

### Métodos de transferência principais
<a name="s3-tm-migration-core-transfer-methods"></a>


| Método da V1 | Método da V2 | Alteração do tipo de retorno | Status da migração | 
| --- | --- | --- | --- | 
| upload(String, String, File) | uploadFile(UploadFileRequest) | Upload → FileUpload | Compatível | 
| upload(PutObjectRequest) | upload(UploadRequest) | Upload → Upload | Compatível | 
| download(String, String, File) | downloadFile(DownloadFileRequest) | Download → FileDownload | Compatível | 
| download(GetObjectRequest, File) | downloadFile(DownloadFileRequest) | Download → FileDownload | Compatível | 
| copy(String, String, String, String) | copy(CopyRequest) | Copy → Copy | Compatível | 
| copy(CopyObjectRequest) | copy(CopyRequest) | Copy → Copy | Compatível | 
| uploadDirectory(String, String, File, boolean) | uploadDirectory( UploadDirectoryRequest) | MultipleFileUpload → DirectoryUpload | Compatível | 
| downloadDirectory(String, String, File) | downloadDirectory( DownloadDirectoryRequest) | MultipleFileDownload → DirectoryDownload | Compatível | 

### Métodos de transferência com retomada
<a name="s3-tm-migration-resumable-methods"></a>


| Método da V1 | Método da V2 | Status da migração | 
| --- | --- | --- | 
| resumeUpload(PersistableUpload) | resumeUploadFile(ResumableFileUpload) | Compatível | 
| resumeDownload(PersistableDownload) | resumeDownloadFile(ResumableFileDownload) | Compatível | 

### Métodos do ciclo de vida
<a name="s3-tm-migration-lifecycle-methods"></a>


| Método da V1 | Método da V2 | Status da migração | 
| --- | --- | --- | 
| shutdownNow() | close() | Compatível | 
| shutdownNow(boolean) | Ajustar manualmente o código usando o método close() | Não suportado | 

### Métodos de cliente V1 incompatíveis
<a name="s3-tm-migration-unsupported-methods"></a>


| Método da V1 | V2 alternativa | Observações | 
| --- | --- | --- | 
| abortMultipartUploads(String, Date) | Use o cliente de nível baixo do Amazon S3 | Não suportado | 
| getAmazonS3Client() | Salvar uma referência separadamente | Incompatível; não há getter na v2 | 
| getConfiguration() | Salvar uma referência separadamente | Incompatível; não há getter na v2 | 
| uploadFileList(...) | Fazer várias chamadas uploadFile() | Não suportado | 
| Métodos copy com um parâmetro TransferStateChangeListener | Usar o TransferListener | [Consulte um exemplo de migração manual](#tm-unsupported-client-methods-copy) | 
| Métodos download com um parâmetro S3ProgressListener | Usar o [https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/transfer/s3/progress/TransferListener.html](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/transfer/s3/progress/TransferListener.html) | [Consulte um exemplo de migração manual](#tm-unsupported-client-methods-download) | 
|  Métodos `downloadDirectory` com quatro ou mais parâmetros  |  | [Consulte um exemplo de migração manual](#tm-unsupported-client-methods-download-dir) | 
| Método upload com um parâmetro ObjectMetadataProvider | Definir metadados na solicitação | [Consulte um exemplo de migração manual](#tm-unsupported-client-methods-upload) | 
| Métodos uploadDirectory com um parâmetro \$1Provider | Definir tags na solicitação | [Consulte um exemplo de migração manual](#tm-unsupported-client-methods-uploadDirectory) | 

#### Métodos `copy` com um parâmetro `TransferStateChangeListener`
<a name="tm-unsupported-client-methods-copy"></a>
+ `copy(CopyObjectRequest copyObjectRequest, AmazonS3 srcS3, TransferStateChangeListener stateChangeListener)`
+ `copy(CopyObjectRequest copyObjectRequest, TransferStateChangeListener stateChangeListener)`

```
// V1 ----------------------------------------------------------------------------------------------
// Initialize source S3 client
AmazonS3 s3client = AmazonS3ClientBuilder.standard()
                .withRegion("us-west-2")
                .build();
                
// Initialize Transfer Manager
TransferManager tm = TransferManagerBuilder.standard()
                .withS3Client(srcS3)
                .build();

CopyObjectRequest copyObjectRequest = new CopyObjectRequest(
                "amzn-s3-demo-source-bucket",
                "source-key",         
                "amzn-s3-demo-destination-bucket", 
                "destination-key"    
        );

TransferStateChangeListener stateChangeListener = new TransferStateChangeListener() {
            @Override
            public void transferStateChanged(Transfer transfer, TransferState state) {
              //Implementation of the TransferStateChangeListener
            }
        };

Copy copy = tm.copy(copyObjectRequest, srcS3, stateChangeListener);


// V2 ----------------------------------------------------------------------------------------------
S3AsyncClient s3AsyncClient = S3AsyncClient.builder()
                .region(Region.US_WEST_2)          
                .build();

S3TransferManager transferManager = S3TransferManager.builder()
                .s3Client(s3AsyncClient)
                .build();

// Create transfer listener (equivalent to TransferStateChangeListener in v1)                                
TransferListener transferListener = new TransferListener() {
            @Override
            public void transferInitiated(Context.TransferInitiated context) {
               //Implementation
               System.out.println("Transfer initiated");
            }

            @Override
            public void bytesTransferred(Context.BytesTransferred context) {
                //Implementation
                System.out.println("Bytes transferred");
            }

            @Override
            public void transferComplete(Context.TransferComplete context) {
                //Implementation
                System.out.println("Transfer completed!");
            }

            @Override
            public void transferFailed(Context.TransferFailed context) {
                //Implementation
                System.out.println("Transfer failed");
            }
        };

CopyRequest copyRequest = CopyRequest.builder()
                              .copyObjectRequest(req -> req
                                  .sourceBucket("amzn-s3-demo-source-bucket")
                                  .sourceKey("source-key")
                                  .destinationBucket("amzn-s3-demo-destination-bucket")
                                  .destinationKey("destination-key")
                               )
                                .addTransferListener(transferListener) // Configure the transferListener into the request
                                .build();
  
Copy copy = transferManager.copy(copyRequest);
```

#### Métodos `download` com um parâmetro `S3ProgressListener`
<a name="tm-unsupported-client-methods-download"></a>
+ `download(GetObjectRequest getObjectRequest, File file, S3ProgressListener progressListener)`
+ `download(GetObjectRequest getObjectRequest, File file, S3ProgressListener progressListener, long timeoutMillis)`
+ `download(GetObjectRequest getObjectRequest, File file, S3ProgressListener progressListener, long timeoutMillis, boolean resumeOnRetry)`

```
// V1 ----------------------------------------------------------------------------------------------
S3ProgressListener progressListener = new S3ProgressListener() {
        @Override
        public void progressChanged(com.amazonaws.event.ProgressEvent progressEvent) {
            long bytes = progressEvent.getBytesTransferred();
            ProgressEventType eventType = progressEvent.getEventType();
            // Use bytes and eventType as needed
        }

        @Override
        public void onPersistableTransfer(PersistableTransfer persistableTransfer) {

        }
    };

Download download1 = tm.download(getObjectRequest, file, progressListener); 
Download download2 = tm.download(getObjectRequest, file, progressListener, timeoutMillis)
Download download3 = tm.download(getObjectRequest, file, progressListener, timeoutMillis, true)

// V2 ----------------------------------------------------------------------------------------------
TransferListener transferListener = new TransferListener() {
    @Override
    public void transferInitiated(Context.InitializedContext context) {
        // Equivalent to ProgressEventType.TRANSFER_STARTED_EVENT
        System.out.println("Transfer initiated");
    }

    @Override
    public void bytesTransferred(Context.BytesTransferred context) {
        // Equivalent to ProgressEventType.REQUEST_BYTE_TRANSFER_EVENT
        long bytes = context.bytesTransferred();
        System.out.println("Bytes transferred: " + bytes);
    }

    @Override
    public void transferComplete(Context.TransferComplete context) {
        // Equivalent to ProgressEventType.TRANSFER_COMPLETED_EVENT
        System.out.println("Transfer completed");
    }

    @Override
    public void transferFailed(Context.TransferFailed context) {
        // Equivalent to ProgressEventType.TRANSFER_FAILED_EVENT
        System.out.println("Transfer failed: " + context.exception().getMessage());
    }
};
DownloadFileRequest downloadFileRequest = 
                         DownloadFileRequest.builder()
                             .getObjectRequest(getObjectRequest)
                             .destination(file.toPath())
                             .addTransferListener(transferListener)
                             .build();

// For download1
FileDownload download = transferManager.downloadFile(downloadFileRequest);

// For download2
CompletedFileDownload completedFileDownload = download.completionFuture()
                                                  .get(timeoutMillis, TimeUnit.MILLISECONDS);

// For download3, the v2 SDK does not have a direct equiavalent to the `resumeOnRetry` method of v1.
// If a download is interrupted, you need to start a new download request.
```

#### Métodos `downloadDirectory` com quatro ou mais parâmetros
<a name="tm-unsupported-client-methods-download-dir"></a>
+ `downloadDirectory(String bucketName, String keyPrefix, File destinationDirectory, boolean resumeOnRetry)`
+ `downloadDirectory(String bucketName, String keyPrefix, File destinationDirectory, boolean resumeOnRetry, KeyFilter filter)`
+ `downloadDirectory(String bucketName, String keyPrefix, File destinationDirectory, KeyFilter filter)`

```
// V1 ----------------------------------------------------------------------------------------------
KeyFilter filter = new KeyFilter() {
            @Override
            public boolean shouldInclude(S3ObjectSummary objectSummary) {
                //Filter implementation
            }
        };
MultipleFileDownload multipleFileDownload = tm.downloadDirectory(bucketName, keyPrefix, destinationDirectory, filter);

// V2 ----------------------------------------------------------------------------------------------
// The v2 SDK does not have a direct equiavalent to the `resumeOnRetry` method of v1.
// If a download is interrupted, you need to start a new download request.
DownloadFilter filter = new DownloadFilter() {
            @Override
            public boolean test(S3Object s3Object) {
                // Filter implementation.
            }
        };

DownloadDirectoryRequest downloadDirectoryRequest = 
                              DownloadDirectoryRequest.builder()
                                  .bucket(bucketName)
                                  .filter(filter)
                                  .listObjectsV2RequestTransformer(builder -> builder.prefix(keyPrefix))
                                  .destination(destinationDirectory.toPath())
                                  .build();
                                                                            
DirectoryDownload directoryDownload = transferManager.downloadDirectory(downloadDirectoryRequest);
```

#### Método `upload` com um parâmetro `ObjectMetadata`
<a name="tm-unsupported-client-methods-upload"></a>
+ `upload(String bucketName, String key, InputStream input, ObjectMetadata objectMetadata)`

```
// V1 ----------------------------------------------------------------------------------------------ObjectMetadata metadata = new ObjectMetadata();
ObjectMetadata metadata = new ObjectMetadata();

metadata.setContentType("text/plain");        // System-defined metadata
metadata.setContentLength(22L);               // System-defined metadata
metadata.addUserMetadata("myKey", "myValue"); // User-defined metadata

PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, inputStream, metadata);

Upload upload = transferManager.upload("amzn-s3-demo-bucket", "my-key", inputStream, metadata);

// V2 ----------------------------------------------------------------------------------------------
/* When you use an InputStream to upload in V2, you should specify the content length 
   and use `RequestBody.fromInputStream()`. 
   If you don't provide the content length, the entire stream will be buffered in memory. 
   If you can't determine the content length, we recommend using the CRT-based S3 client.
*/
Map<String, String> userMetadata = new HashMap<>();
userMetadata.put("x-amz-meta-myKey", "myValue");

PutObjectRequest putObjectRequest = 
                        PutObjectRequest.builder()
                            .bucket("amzn-s3-demo-bucket1")
                            .key("k")
                            .contentType("text/plain") //System-defined metadata usually has separate methods in the builder.
                            .contentLength(22L)
                            .metadata(userMetadata) //metadata() is only for user-defined metadata.
                            .build();

UploadRequest uploadRequest = 
                        UploadRequest.builder()
                            .putObjectRequest(putObjectRequest)
                            .requestBody(AsyncRequestBody.fromInputStream(stream, 22L, executor))
                            .build();
                                                   
transferManager.upload(uploadRequest).completionFuture().join();
```

#### `uploadDirectory` com parâmetro `ObjectMetadataProvider`
<a name="tm-unsupported-client-methods-uploadDirectory"></a>
+ `uploadDirectory(String bucketName, String virtualDirectoryKeyPrefix, File directory, boolean includeSubdirectories, ObjectMetadataProvider metadataProvider)`
+ `uploadDirectory(String bucketName, String virtualDirectoryKeyPrefix, File directory, boolean includeSubdirectories, ObjectMetadataProvider metadataProvider, ObjectTaggingProvider taggingProvider)`
+ `uploadDirectory(String bucketName, String virtualDirectoryKeyPrefix, File directory, boolean includeSubdirectories, ObjectMetadataProvider metadataProvider, ObjectTaggingProvider taggingProvider, ObjectCannedAclProvider cannedAclProvider)`

```
// V1 ----------------------------------------------------------------------------------------------
tm.uploadDirectory(bucketName, virtualDirectoryKeyPrefix, directory, includeSubdirectories, metadataProvider)
tm.uploadDirectory(bucketName, virtualDirectoryKeyPrefix, directory, includeSubdirectories, metadataProvider, taggingProvider)
tm.uploadDirectory(bucketName, virtualDirectoryKeyPrefix, directory, includeSubdirectories, metadataProvider, taggingProvider, cannedAclProvider)

// V2 ----------------------------------------------------------------------------------------------
UploadDirectoryRequest request = UploadDirectoryRequest.builder()
                                  .bucket(bucketName)
                                  .s3Prefix(virtualDirectoryKeyPrefix)
                                  .source(directory.toPath())
                                  .maxDepth(includeSubdirectories ? Integer.MAX_VALUE : 1)
                                  .uploadFileRequestTransformer(builder -> {
                                      // 1.Replace `ObjectMetadataProvider`, `ObjectTaggingProvider`, and `ObjectCannedAclProvider` with an
                                        // `UploadFileRequestTransformer` that can combine the functionality of all three *Provider implementations.
                                        // 2. Convert your v1 `ObjectMetadata` to v2 `PutObjectRequest` parameters.
                                        // 3. Convert your v1 `ObjectTagging` to v2 `Tagging`.
                                        // 4. Convert your v1 `CannedAccessControlList` to v2 `ObjectCannedACL`.
                                  })
                                  .build();
        
DirectoryUpload directoryUpload = transferManager.uploadDirectory(request);
```

## Migração de objetos de modelo
<a name="s3-tm-migration-model-objects"></a>

Em AWS SDK for Java 2.x, muitos dos objetos do `TransferManager` modelo foram redesenhados e vários métodos getter e setter disponíveis nos objetos do modelo da v1 não são mais suportados. 

Na v2, você pode usar a classe `CompletableFuture<T>` para realizar ações quando a transferência for concluída, seja com êxito ou com uma exceção. Você pode usar o método `join()` para aguardar a conclusão, se necessário. 

### Objetos de transferência principal
<a name="s3-tm-migration-core-transfer-objects"></a>


| Classe V1 | Classe V2 | Status da migração | 
| --- | --- | --- | 
| TransferManager | S3TransferManager | Compatível | 
| TransferManagerBuilder | S3TransferManager.Builder | Compatível | 
| Transfer | Transfer | Compatível | 
| AbortableTransfer | Transfer | Compatível (sem classe separada) | 
| Copy | Copy | Compatível | 
| Download | FileDownload | Compatível | 
| Upload | Upload / FileUpload | Compatível | 
| MultipleFileDownload | DirectoryDownload | Compatível | 
| MultipleFileUpload | DirectoryUpload | Compatível | 

### Objetos de persistência
<a name="s3-tm-migration-persistence-objects"></a>


| Classe V1 | Classe V2 | Status da migração | 
| --- | --- | --- | 
| PersistableDownload | ResumableFileDownload | Compatível | 
| PersistableUpload | ResumableFileUpload | Compatível | 
| PersistableTransfer | ResumableTransfer | Compatível | 
| PauseResult<T> | Objeto com retomada direta | Não suportado | 

### Objetos de resultado
<a name="s3-tm-migration-result-objects"></a>


| Classe V1 | Classe V2 | Status da migração | 
| --- | --- | --- | 
| CopyResult | CompletedCopy | Compatível | 
| UploadResult | CompletedUpload | Compatível | 

### Objetos de configuração
<a name="s3-tm-migration-configuration-objects"></a>


| Classe V1 | Classe V2 | Status da migração | 
| --- | --- | --- | 
| TransferManagerConfiguration | MultipartConfiguration (no cliente do Amazon S3) | Compatível | 
| TransferProgress | TransferProgress \$1 TransferProgressSnapshot | Compatível | 
| KeyFilter | DownloadFilter | Compatível | 

### Objetos não compatíveis
<a name="s3-tm-migration-unsupported-objects"></a>


| Classe V1 | V2 alternativa | Status da migração | 
| --- | --- | --- | 
| PauseStatus | Sem compatibilidade | Não suportado | 
| UploadContext | Sem compatibilidade | Não suportado | 
| ObjectCannedAclProvider | PutObjectRequest.builder().acl() | Não suportado | 
| ObjectMetadataProvider | PutObjectRequest.builder().metadata() | Não suportado | 
| ObjectTaggingProvider | PutObjectRequest.builder().tagging() | Não suportado | 
| PresignedUrlDownload | Sem compatibilidade | Não suportado | 

## TransferManagerBuilder migração de configuração
<a name="s3-tm-migration-builder-configuration"></a>

### Alterações de configuração
<a name="migration-transfer-manager-config-changes"></a>

As alterações de configuração que você precisa definir para o Gerenciador de Transferências v2 dependem do cliente do S3 utilizado. Você pode escolher entre o cliente S3 AWS baseado em CRT ou o cliente assíncrono S3 padrão baseado em Java. Consulte informações sobre as diferenças no tópico [Clientes S3 no AWS SDK for Java 2.x](examples-s3.md#s3-clients).

------
#### [ Use the AWS CRT-based S3 client ]


****  

| Configuração | v1 | v2 - Gerenciador de transferências usando o cliente S3 baseado em AWS CRT | 
| --- | --- | --- | 
|    (obtenha um construtor)  |  <pre>TransferManagerBuilder tmBuilder = <br />   TransferManagerBuilder.standard();</pre>  |  <pre>S3TransferManager.Builder tmBuilder  = <br />  S3TransferManager.builder();</pre>  | 
|    Cliente do S3  |  <pre>tmBuilder.withS3Client(...);<br />tmBuilder.setS3Client(...);</pre>  |  <pre>tmBuilder.s3Client(...);</pre>  | 
|    Executor  |  <pre>tmBuilder.withExecutorFactory(...);<br />tmBuilder.setExecutorFactory(...);</pre>  |  <pre>tmBuilder.executor(...);</pre>  | 
|    Encerrar grupos de threads  |  <pre>tmBuilder.withShutDownThreadPools(...);<br />tmBuilder.setShutdownThreadPools(...);</pre>  | Sem suporte. O executor fornecido não será desligado quando o S3TransferManager for fechado | 
|    Tamanho mínimo da parte de upload  |  <pre>tmBuilder.withMinimumUploadPartSize(...);<br />tmBuilder.setMinimumUploadPartSize(...);</pre>  |  <pre>S3AsyncClient s3 = S3AsyncClient.crtBuilder().<br />      minimumPartSizeInBytes(...).build();<br /><br />tmBuilder.s3Client(s3);</pre>  | 
|    Limite de multipart upload  |  <pre>tmBuilder.withMultipartUploadThreshold(...);<br />tmBuilder.setMultipartUploadThreshold(...);</pre>  |  <pre>S3AsyncClient s3 = S3AsyncClient.crtBuilder().<br />      thresholdInBytes(...).build();<br /><br />tmBuilder.s3Client(s3);</pre>  | 
|    Tamanho mínimo da parte de cópia  |  <pre>tmBuilder.withMultipartCopyPartSize(...);<br />tmBuilder.setMultipartCopyPartSize(...);</pre>  |  <pre>S3AsyncClient s3 = S3AsyncClient.crtBuilder().<br />      minimumPartSizeInBytes(...).build();<br /><br />tmBuilder.s3Client(s3);</pre>  | 
|    Limite de cópia de multipart  |  <pre>tmBuilder.withMultipartCopyThreshold(...);<br />tmBuilder.setMultipartCopyThreshold(...);</pre>  |  <pre>S3AsyncClient s3 = S3AsyncClient.crtBuilder().<br />      thresholdInBytes(...).build();<br /><br />tmBuilder.s3Client(s3);</pre>  | 
|    Desabilitar downloads paralelos  |  <pre>tmBuilder.withDisableParallelDownloads(...);<br />tmBuilder.setDisableParallelDownloads(...);</pre>  | Desabilite os downloads paralelos passando um cliente do S3 padrão baseado em Java com multipart desativado (padrão) para o Gerenciador de Transferências.<pre>S3AsyncClient s3 =<br />   S3AsyncClient.builder().build();<br /><br />tmBuilder.s3Client(s3);</pre> | 
|    Sempre calcule o multipart md5  |  <pre>tmBuilder.withAlwaysCalculateMultipartMd5(...);<br />tmBuilder.setAlwaysCalculateMultipartMd5(...);</pre>  | Sem compatibilidade. | 

------
#### [ Use Java-based S3 async client ]


****  

| Configuração | v1 | v2: Gerenciador de Transferências que usa o cliente assíncrono do S3 baseado em Java | 
| --- | --- | --- | 
|    (obtenha um construtor)  |  <pre>TransferManagerBuilder tmBuilder = <br />   TransferManagerBuilder.standard();</pre>  |  <pre>S3TransferManager.Builder tmBuilder  = <br />  S3TransferManager.builder();</pre>  | 
|    Cliente do S3  |  <pre>tmBuilder.withS3Client(...);<br />tmBuilder.setS3Client(...);</pre>  |  <pre>tmBuilder.s3Client(...);</pre>  | 
|    Executor  |  <pre>tmBuilder.withExecutorFactory(...);<br />tmBuilder.setExecutorFactory(...);</pre>  |  <pre>tmBuilder.executor(...);</pre>  | 
|    Encerrar grupos de threads  |  <pre>tmBuilder.withShutDownThreadPools(...);<br />tmBuilder.setShutdownThreadPools(...);</pre>  | Sem suporte. O executor fornecido não será desligado quando o S3TransferManager for fechado | 
|    Tamanho mínimo da parte de upload  |  <pre>tmBuilder.withMinimumUploadPartSize(...);<br />tmBuilder.setMinimumUploadPartSize(...);</pre>  |  <pre>S3AsyncClient s3 = S3AsyncClient.builder()<br />    .multipartConfiguration(cfg -><br />        cfg.minimumPartSizeInBytes(...)).build();<br /><br />tmBuilder.s3Client(s3);</pre>  | 
|    Limite de multipart upload  |  <pre>tmBuilder.withMultipartUploadThreshold(...);<br />tmBuilder.setMultipartUploadThreshold(...);</pre>  |  <pre>S3AsyncClient s3 = S3AsyncClient.builder()<br />    .multipartConfiguration(cfg -><br />        cfg.thresholdInBytes(...)).build();<br /><br />tmBuilder.s3Client(s3);</pre>  | 
|    Tamanho mínimo da parte de cópia  |  <pre>tmBuilder.withMultipartCopyPartSize(...);<br />tmBuilder.setMultipartCopyPartSize(...);</pre>  |  <pre>S3AsyncClient s3 = S3AsyncClient.builder()<br />    .multipartConfiguration(cfg -><br />        cfg.minimumPartSizeInBytes(...)).build();<br /><br />tmBuilder.s3Client(s3);</pre>  | 
|    Limite de cópia de multipart  |  <pre>tmBuilder.withMultipartCopyThreshold(...);<br />tmBuilder.setMultipartCopyThreshold(...);</pre>  |  <pre>S3AsyncClient s3 = S3AsyncClient.builder()<br />    .multipartConfiguration(cfg -><br />        cfg.thresholdInBytes(...)).build();<br /><br />tmBuilder.s3Client(s3);</pre>  | 
|    Desabilitar downloads paralelos  |  <pre>tmBuilder.withDisableParallelDownloads(...);<br />tmBuilder.setDisableParallelDownloads(...);</pre>  | Desabilite os downloads paralelos passando um cliente do S3 padrão baseado em Java com multipart desativado (padrão) para o Gerenciador de Transferências.<pre>S3AsyncClient s3 =<br />   S3AsyncClient.builder().build();<br /><br />tmBuilder.s3Client(s3);</pre> | 
|    Sempre calcule o multipart md5  |  <pre>tmBuilder.withAlwaysCalculateMultipartMd5(...);<br />tmBuilder.setAlwaysCalculateMultipartMd5(...);</pre>  | Sem compatibilidade. | 

------

## Alteração de comportamento
<a name="s3-tm-migration-behavior-changes"></a>

### Operações assíncronas
<a name="s3-tm-migration-async-operations"></a>

**V1 (bloqueio):**

```
Upload upload = transferManager.upload("amzn-s3-demo-bucket", "key", file);
upload.waitForCompletion(); // Blocks until complete
```

**V2 (assíncrono):**

```
FileUpload upload = transferManager.uploadFile(UploadFileRequest.builder()
    .putObjectRequest(PutObjectRequest.builder()
        .bucket("amzn-s3-demo-bucket")
        .key("key")
        .build())
    .source(file)
    .build());

CompletedFileUpload result = upload.completionFuture().join(); // Blocks until complete
// Or handle asynchronously:
upload.completionFuture().thenAccept(result -> {
    System.out.println("Upload completed: " + result.response().eTag());
});
```

### Tratamento de erros
<a name="s3-tm-migration-error-handling"></a>

**V1:** as transferências de diretórios falham completamente se alguma subsolicitação falha.

**V2:** as transferências de diretórios são concluídas com êxito mesmo se algumas subsolicitações falham. Verifique se há erros de forma explícita:

```
DirectoryUpload directoryUpload = transferManager.uploadDirectory(request);
CompletedDirectoryUpload result = directoryUpload.completionFuture().join();

// Check for failed transfers
if (!result.failedTransfers().isEmpty()) {
    System.out.println("Some uploads failed:");
    result.failedTransfers().forEach(failed -> 
        System.out.println("Failed: " + failed.exception().getMessage()));
}
```

### Download paralelo por meio de buscas de intervalo de bytes
<a name="migration-transfer-manager-behavior-fetches"></a>

Quando o recurso de transferência paralela automática está ativado no SDK v2, o Gerenciador de Transferências do S3 usa [buscas de intervalo de bytes](https://docs.aws.amazon.com/AmazonS3/latest/userguide/optimizing-performance-guidelines.html#optimizing-performance-guidelines-get-range) para recuperar partes específicas do objeto em paralelo (download multipart). A forma como um objeto é baixado com a v2 não depende de como o objeto foi originalmente carregado. Todos os downloads podem se beneficiar da alta taxa de transferência e da simultaneidade. 

Por outro lado, com o Gerenciador de Transferências v1, faz diferença como o objeto foi originalmente carregado. O Gerenciador de Transferências v1 recupera as partes do objeto da mesma forma que as partes foram carregadas. Se um objeto foi originalmente carregado como um único objeto, o Gerenciador de transferência v1 não é capaz de acelerar o processo de download usando subsolicitações.

# Alterações na análise do Amazon URIs S3 da versão 1 para a versão 2
<a name="migration-s3-uri-parser"></a>

Este tópico detalha as mudanças na análise do Amazon URIs S3 da versão 1 (v1) para a versão 2 (v2.).

## Alterações de alto nível
<a name="migration-3-uri-parser-api-changes"></a>

Para começar a analisar um URI do S3 na v1, você instancia um `AmazonS3URI` usando um construtor. Na v2, você chama `parseUri()` em uma instância de `S3Utilities`, para retornar um `S3URI`.


****  

| Alteração | v1 |  v2 da  | 
| --- | --- | --- | 
|    Dependências do Maven  |  <pre><dependencyManagement><br />    <dependencies><br />        <dependency><br />            <groupId>com.amazonaws</groupId><br />            <artifactId>aws-java-sdk-bom</artifactId><br />            <version>1.12.5871</version><br />            <type>pom</type><br />            <scope>import</scope><br />        </dependency><br />    </dependencies><br /></dependencyManagement><br /><dependencies><br />    <dependency>  <br />        <groupId>com.amazonaws</groupId><br />        <artifactId>s3</artifactId><br />    </dependency><br /></dependencies></pre>  |  <pre><dependencyManagement><br />    <dependencies><br />        <dependency><br />            <groupId>software.amazon.awssdk</groupId><br />            <artifactId>bom</artifactId><br />            <version>2.27.212</version><br />            <type>pom</type><br />            <scope>import</scope><br />        </dependency><br />    </dependencies><br /></dependencyManagement><br /><dependencies><br />    <dependency><br />        <groupId>software.amazon.awssdk</groupId><br />        <artifactId>s3</artifactId><br />    </dependency><br /></dependencies></pre>  | 
| Nome do pacote | com.amazonaws.services.s3 | software.amazon.awssdk.services.s3 | 
| Nomes da classe | [AmazonS3URI](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/AmazonS3URI.html) | [S3URI](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/s3/S3Uri.html) | 

1 [Versão mais recente](https://central.sonatype.com/artifact/com.amazonaws/aws-java-sdk-bom). 2 [Versão mais recente](https://central.sonatype.com/artifact/software.amazon.awssdk/bom).

## Alterações de API
<a name="migration-3-uri-parser-api-changes"></a>


| Comportamento | v1 |  v2 da  | 
| --- | --- | --- | 
| Analise um URI do S3. |  <pre>URI uri = URI.create( "https://s3.amazonaws.com");<br /><br />AmazonS3Uri s3Uri = <br />    new AmazonS3URI(uri, false);</pre>  |  <pre>S3Client s3Client = S3Client.create();<br />S3Utilities s3Utilities =<br />    s3Client.utilities();<br /><br />S3Uri s3Uri =<br />    s3Utilities.parseUri(uri);</pre>  | 
| Recupere o nome do bucket de um URI do S3. |  <pre>String bucket = s3Uri.getBucket();</pre>  |  <pre>Optional<String> bucket = s3Uri.bucket();</pre>  | 
| Recupere a chave. |  <pre>String key = s3Uri.getKey();</pre>  |  <pre>Optional<String> key = s3Uri.key();</pre>  | 
| Recupere a região. |  <pre>String region = s3Uri.getRegion();</pre>  |  <pre>Optional<Region> region = s3Uri.region();<br /><br />String region;<br />if (s3Uri.region().isPresent()) {<br />    region = s3Uri.region().get().id();<br />}</pre>  | 
|  Recupere se o URI do S3 está no estilo de caminho.  |  <pre>boolean isPathStyle = s3Uri.isPathStyle();</pre>  |  <pre>boolean isPathStyle = s3Uri.isPathStyle();</pre>  | 
| Recupere o ID da versão. |  <pre>String versionId = s3Uri.getVersionId();</pre>  |  <pre>Optional<String> versionId = <br />    s3Uri.firstMatchingRawQueryParameter("versionId");</pre>  | 
| Recupere os parâmetros de consulta. | N/D |  <pre>Map<String, List<String>> queryParams =<br />    s3Uri.rawQueryParameters();</pre>  | 

### Mudanças de comportamento
<a name="migration-s3-uri-parser-behavior-changes"></a>

#### Codificação de URL
<a name="migration-s3-uri-parser-behavior-changes-URLencoding"></a>

A v1 fornece a opção de passar um sinalizador para especificar se o URI deve ser codificado em URL. O valor padrão é `true`. 

Na v2, a codificação de URL não é compatível. Se você trabalha com chaves de objeto ou parâmetros de consulta que tenham caracteres reservados ou inseguros, codifique-os em URL. Por exemplo, você precisa substituir um espaço em branco `" "` por `%20`.

# Alterações na API de Notificações de Eventos do S3 da versão 1 para a versão 2
<a name="migration-s3-event-notification"></a>

Este tópico detalha as alterações na API de Notificações de Eventos do S3 da versão 1.x (v1) para a versão 2 .x (v2) do AWS SDK para Java.

## Alterações de alto nível
<a name="migration-s3-event-notification-hl"></a>

### Alterações estruturais
<a name="migration-s3-event-notification-hl-struct"></a>

A V1 usa classes internas estáticas para tipos `EventNotificationRecord` e seus atributos, enquanto a v2 usa classes públicas separadas para tipos `EventNotificationRecord`.

### Alterações de convenção de nomenclatura
<a name="migration-s3-event-notification-hl-naming"></a>

*Na v1, os nomes das classes de atributos incluem o sufixo *Entity*, enquanto a v2 omite esse sufixo para simplificar a nomenclatura: por exemplo, eventData em vez de. *eventDataEntity**

## Alterações em nomes de classes, dependências e pacotes
<a name="migration-s3-event-notification-deps"></a>

Na v1, as classes da API de Notificações de Eventos do S3 são importadas transitivamente junto com o módulo do S3 (artifactId `aws-java-sdk-s3`). No entanto, na v2, você precisa adicionar uma dependência do artefato `s3-event-notifications`.


****  

| Alteração | v1 |  v2 da  | 
| --- | --- | --- | 
|    Dependências do Maven  |  <pre><dependencyManagement><br />    <dependencies><br />        <dependency><br />            <groupId>com.amazonaws</groupId><br />            <artifactId>aws-java-sdk-bom</artifactId><br />            <version>1.X.X</version><br />            <type>pom</type><br />            <scope>import</scope><br />        </dependency><br />    </dependencies><br /></dependencyManagement><br /><dependencies><br />    <dependency><br />        <groupId>com.amazonaws</groupId><br />        <artifactId>aws-java-sdk-s3</artifactId><br />    </dependency><br /></dependencies></pre>  |  <pre><dependencyManagement><br />    <dependencies><br />        <dependency><br />            <groupId>software.amazon.awssdk</groupId><br />            <artifactId>bom</artifactId><br />            <version>2.X.X1</version><br />            <type>pom</type><br />            <scope>import</scope><br />        </dependency><br />    </dependencies><br /></dependencyManagement><br /><dependencies><br />    <dependency><br />        <groupId>software.amazon.awssdk</groupId><br />        <artifactId>s3-event-notifications</artifactId><br />    </dependency><br /></dependencies></pre>  | 
| Nome do pacote | com.amazonaws.services.s3.event | software.amazon.awssdk.eventnotifications.s3.model | 
| Nomes da classe |  [S3EventNotification](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/event/S3EventNotification.html) [S3 .S3 EventNotification EventNotificationRecord](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/event/S3EventNotification.S3EventNotificationRecord.html) [S3EventNotification. GlacierEventDataEntity](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/event/S3EventNotification.GlacierEventDataEntity.html) [S3EventNotification. IntelligentTieringEventDataEntity](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/event/S3EventNotification.IntelligentTieringEventDataEntity.html) [S3EventNotification. LifecycleEventDataEntity](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/event/S3EventNotification.LifecycleEventDataEntity.html) [S3EventNotification. ReplicationEventDataEntity](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/event/S3EventNotification.ReplicationEventDataEntity.html) [S3EventNotification. RequestParametersEntity](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/event/S3EventNotification.RequestParametersEntity.html) [S3EventNotification. ResponseElementsEntity](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/event/S3EventNotification.ResponseElementsEntity.html) [S3EventNotification. RestoreEventDataEntity](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/event/S3EventNotification.RestoreEventDataEntity.html) [S3 .S3 EventNotification BucketEntity](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/event/S3EventNotification.S3BucketEntity.html) [S3. Entidade S3 EventNotification](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/event/S3EventNotification.S3Entity.html) [S3 .S3 EventNotification ObjectEntity](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/event/S3EventNotification.S3ObjectEntity.html) [S3EventNotification. TransitionEventDataEntity](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/event/S3EventNotification.TransitionEventDataEntity.html) [S3EventNotification. UserIdentityEntity](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/event/S3EventNotification.UserIdentityEntity.html)  |   [S3EventNotification](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/eventnotifications/s3/model/S3EventNotification.html) [S3EventNotificationRecord](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/eventnotifications/s3/model/S3EventNotificationRecord.html) [GlacierEventData](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/eventnotifications/s3/model/GlacierEventData.html) [IntelligentTieringEventData](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/eventnotifications/s3/model/IntelligentTieringEventData.html) [LifecycleEventData](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/eventnotifications/s3/model/LifecycleEventData.html) [ReplicationEventData](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/eventnotifications/s3/model/ReplicationEventData.html) [RequestParameters](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/eventnotifications/s3/model/RequestParameters.html) [ResponseElements](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/eventnotifications/s3/model/ResponseElements.html) [RestoreEventData](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/eventnotifications/s3/model/RestoreEventData.html) [S3 Bucket](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/eventnotifications/s3/model/S3Bucket.html) [S3](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/eventnotifications/s3/model/S3.html) [Objeto S3](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/eventnotifications/s3/model/S3Object.html) [TransitionEventData](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/eventnotifications/s3/model/TransitionEventData.html) [UserIdentity](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/eventnotifications/s3/model/UserIdentity.html)  | 

1 [Versão mais recente](https://central.sonatype.com/artifact/software.amazon.awssdk/bom).

## Alterações de API
<a name="migration-s3-event-notification-API-changes"></a>

### JSON para `S3EventNotification` e reverso
<a name="migration-s3-event-notification-API-changes-conv"></a>


| Caso de uso | v1 |  v2 da  | 
| --- | --- | --- | 
| Criar S3EventNotification com base em uma string JSON |  <pre>S3EventNotification notification = <br />        S3EventNotification.parseJson(message.body());</pre>  |  <pre>S3EventNotification notification = <br />        S3EventNotification.fromJson(message.body());</pre>  | 
| Converter S3EventNotification em uma string JSON |  <pre>String json = notification.toJson();</pre>  |  <pre>String json = notification.toJson();</pre>  | 

### Atributos de acesso de `S3EventNotification`
<a name="migration-s3-event-notification-API-changes-attr"></a>


| Caso de uso | v1 |  v2 da  | 
| --- | --- | --- | 
| Recuperar registros de uma notificação |  <pre>List<S3EventNotification.S3EventNotificationRecord> records = <br />        notifcation.getRecords();</pre>  |  <pre>List<S3EventNotificationRecord> records = <br />        notification.getRecords();</pre>  | 
| Recuperar um registro de uma lista de registros |  <pre>S3EventNotification.S3EventNotificationRecord record = <br />        records.stream().findAny().get();</pre>  |  <pre>S3EventNotificationRecord record = <br />        records.stream().findAny().get();</pre>  | 
| Recuperar dados de eventos do Glacier |  <pre>S3EventNotification.GlacierEventDataEntity glacierEventData =<br />        record.getGlacierEventData();</pre>  |  <pre>GlacierEventData glacierEventData = <br />        record.getGlacierEventData();</pre>  | 
| Recuperar dados de eventos de restauração de um evento do Glacier |  <pre>S3EventNotification.RestoreEventDataEntity restoreEventData = <br />        glacierEventData.getRestoreEventDataEntity();</pre>  |  <pre>RestoreEventData restoreEventData = <br />        glacierEventData.getRestoreEventData();</pre>  | 
| Recuperar parâmetros de solicitação |  <pre>S3EventNotification.RequestParametersEntity requestParameters = <br />        record.getRequestParameters();</pre>  |  <pre>RequestParameters requestParameters = <br />        record.getRequestParameters();</pre>  | 
| Recuperar dados de eventos do Intelligent Tiering |  <pre>S3EventNotification.IntelligentTieringEventDataEntity tieringEventData = <br />        record.getIntelligentTieringEventData();</pre>  |  <pre>IntelligentTieringEventData intelligentTieringEventData = <br />        record.getIntelligentTieringEventData();</pre>  | 
| Recuperar dados de eventos do ciclo de vida |  <pre>S3EventNotification.LifecycleEventDataEntity lifecycleEventData = <br />        record.getLifecycleEventData();</pre>  |  <pre>LifecycleEventData lifecycleEventData = <br />        record.getLifecycleEventData();</pre>  | 
| Recuperar o nome do evento como enumeração |  <pre>S3Event eventNameAsEnum = record.getEventNameAsEnum();</pre>  |  <pre>//getEventNameAsEnum does not exist; use 'getEventName()'<br />String eventName = record.getEventName();</pre>  | 
| Recuperar dados de eventos de replicação |  <pre>S3EventNotification.ReplicationEventDataEntity replicationEntity = <br />        record.getReplicationEventDataEntity();</pre>  |  <pre>ReplicationEventData replicationEventData = <br />        record.getReplicationEventData();</pre>  | 
| Recuperar informações do objeto e do bucket do S3 |  <pre>S3EventNotification.S3Entity s3 = record.getS3();</pre>  |  <pre>S3 s3 = record.getS3();</pre>  | 
| Recuperar informações de identidade do usuário |  <pre>S3EventNotification.UserIdentityEntity userIdentity = <br />        record.getUserIdentity();</pre>  |  <pre>UserIdentity userIdentity = <br />        record.getUserIdentity();</pre>  | 
| Recuperar elementos de resposta |  <pre>S3EventNotification.ResponseElementsEntity responseElements = <br />        record.getResponseElements();</pre>  |  <pre>ResponseElements responseElements = <br />        record.getResponseElements();</pre>  | 

## Migrar a versão da biblioteca `aws-lambda-java-events`
<a name="migration-s3-events-notification-lambda-lib"></a>

Se você costuma [aws-lambda-java-events](https://github.com/aws/aws-lambda-java-libs/tree/main/aws-lambda-java-events)trabalhar com eventos de notificação do S3 em uma função Lambda, recomendamos que você atualize para a versão 3.x.x mais recente. As versões recentes eliminam todas as dependências do AWS SDK para Java 1.x da API de notificação de eventos do S3.

Consulte mais informações sobre as diferenças no gerenciamento de Notificações de Eventos do S3 entre a biblioteca `aws-lambda-java-events` e o SDK para Java 2.x em [Processe eventos do S3 no Lambda com bibliotecas Java: e AWS SDK for Java 2.x `aws-lambda-java-events`](examples-s3-event-notifications.md#s3-event-notif-processing-options).

# Alterações no arquivos de perfis
<a name="migration-profile-file"></a>

O AWS SDK for Java 2.x analisa as definições do perfil em `~/.aws/config` e `~/.aws/credentials` para emular melhor a forma como a AWS CLI analisa os arquivos.

O SDK para Java 2.x.
+ Resolve um `~/` ou `~` seguido pelo separador de caminho padrão do sistema de arquivos no início do caminho, verificando, em ordem, `$HOME`, `$USERPROFILE` (somente Windows), `$HOMEDRIVE`, `$HOMEPATH` (somente Windows) e, então, a propriedade do sistema `user.home`.
+ Procura a variável de ambiente `AWS_SHARED_CREDENTIALS_FILE` em vez de `AWS_CREDENTIAL_PROFILES_FILE`.
+ Descarta silenciosamente as definições de perfil nos arquivos de configuração sem a palavra `profile` no início do nome do perfil.
+ Elimina silenciosamente as definições de perfil que não consistem em caracteres alfanuméricos, sublinhados ou traços (após a palavra inicial `profile` ter sido removida dos arquivos de configuração).
+ Mescla as configurações das definições de perfil duplicadas no mesmo arquivo.
+ Mescla as configurações das definições de perfil duplicadas nos arquivos de configuração e credenciais.
+ NÃO mescla as configurações se tanto `[profile foo]` como `[foo]` estiverem no mesmo arquivo.
+ Usa as configurações em `[profile foo]` se tanto `[profile foo]` como `[foo]` estiverem no arquivo de configuração.
+ Usa o valor da última configuração duplicada no mesmo arquivo e perfil.
+ Reconhece tanto `;` como `#` por definir um comentário.
+ Reconhece `;` e `#` nas definições de perfil para definir um comentário, mesmo que os caracteres estejam adjacentes ao colchete de fechamento.
+ Reconhece `;` e `#` para definir um comentário somente ao configurar valores apenas se eles forem precedidos por espaços em branco.
+ Reconhece `;` e `#` e todo o conteúdo a seguir ao definir valores se eles não forem precedidos por espaços em branco.
+ Considera as credenciais baseadas em perfil como as credenciais de maior prioridade. O SDK 2.x sempre usa credenciais baseadas em perfil se o usuário especificar a propriedade `role_arn`.
+ Considera as credenciais baseadas em sessão as credenciais de segunda maior prioridade. O SDK 2.x sempre usa credenciais baseadas em sessão se as credenciais baseadas em perfil não forem usadas e o usuário especificar as propriedades `aws_access_key_id` e `aws_session_token`.
+ Usa credenciais básicas se as credenciais baseadas em perfil e sessão não forem usadas e o usuário especificar a propriedade `aws_access_key_id`.

# Variáveis de ambiente e alterações nas propriedades do sistema
<a name="migration-env-and-system-props"></a>


| Variável de ambiente de 1.x | Propriedade do sistema de 1.x | Variável de ambiente de 2.x | Propriedade do sistema de 2.x | 
| --- | --- | --- | --- | 
| AWS\$1ACCESS\$1KEY\$1IDAWS\$1ACCESS\$1KEY | aws.accessKeyId | AWS\$1ACCESS\$1KEY\$1ID | aws.accessKeyId | 
| AWS\$1SECRET\$1KEYAWS\$1SECRET\$1ACCESS\$1KEY | aws.secretKey | AWS\$1SECRET\$1ACCESS\$1KEY | aws.secretAccessKey | 
| AWS\$1SESSION\$1TOKEN | aws.sessionToken | AWS\$1SESSION\$1TOKEN | aws.sessionToken | 
| AWS\$1REGION | aws.region | AWS\$1REGION | aws.region | 
| AWS\$1CONFIG\$1FILE |   | AWS\$1CONFIG\$1FILE | aws.configFile | 
| AWS\$1CREDENTIAL\$1PROFILES\$1FILE |   | AWS\$1SHARED\$1CREDENTIALS\$1FILE | aws.sharedCredentialsFile | 
| AWS\$1PROFILE | aws.profile | AWS\$1PROFILE | aws.profile | 
| AWS\$1EC2\$1METADATA\$1DISABLED | com.amazonaws.sdk.disableEc2Metadata | AWS\$1EC2\$1METADATA\$1DISABLED | aws.disableEc2Metadata | 
|   | com.amazonaws.sdk.ec2MetadataServiceEndpointOverride | AWS\$1EC2\$1METADATA\$1SERVICE\$1ENDPOINT | aws.ec2MetadataServiceEndpoint | 
| AWS\$1CONTAINER\$1CREDENTIALS\$1RELATIVE\$1URI |   | AWS\$1CONTAINER\$1CREDENTIALS\$1RELATIVE\$1URI | aws.containerCredentialsPath | 
| AWS\$1CONTAINER\$1CREDENTIALS\$1FULL\$1URI |   | AWS\$1CONTAINER\$1CREDENTIALS\$1FULL\$1URI | aws.containerCredentialsFullUri | 
| AWS\$1CONTAINER\$1AUTHORIZATION\$1TOKEN |   | AWS\$1CONTAINER\$1AUTHORIZATION\$1TOKEN | aws.containerAuthorizationToken | 
| AWS\$1CBOR\$1DISABLED | com.amazonaws.sdk.disableCbor | CBOR\$1ENABLED | aws.cborEnabled | 
| AWS\$1ION\$1BINARY\$1DISABLE | com.amazonaws.sdk.disableIonBinary | BINARY\$1ION\$1ENABLED | aws.binaryIonEnabled | 
| AWS\$1EXECUTION\$1ENV |   | AWS\$1EXECUTION\$1ENV | aws.executionEnvironment | 
|   | com.amazonaws.sdk.disableCertChecking | Incompatível ([recurso de solicitação](https://github.com/aws/aws-sdk-java-v2/issues/new)) | Incompatível ([recurso de solicitação](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
|   | com.amazonaws.sdk.enableDefaultMetrics | [Sem compatibilidade](https://github.com/aws/aws-sdk-java-v2/issues/23) | [Sem compatibilidade](https://github.com/aws/aws-sdk-java-v2/issues/23) | 
|   | com.amazonaws.sdk.enableThrottledRetry | [Sem compatibilidade](https://github.com/aws/aws-sdk-java-v2/issues/645) | [Sem compatibilidade](https://github.com/aws/aws-sdk-java-v2/issues/645) | 
|   | com.amazonaws.regions.RegionUtils.fileOverride | Incompatível ([recurso de solicitação](https://github.com/aws/aws-sdk-java-v2/issues/new)) | Incompatível ([recurso de solicitação](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
|   | com.amazonaws.regions.RegionUtils.disableRemote | Incompatível ([recurso de solicitação](https://github.com/aws/aws-sdk-java-v2/issues/new)) | Incompatível ([recurso de solicitação](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
|   | com.amazonaws.services.s3.disableImplicitGlobalClients | Incompatível ([recurso de solicitação](https://github.com/aws/aws-sdk-java-v2/issues/new)) | Incompatível ([recurso de solicitação](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
|   | com.amazonaws.sdk.enableInRegionOptimizedMode | Incompatível ([recurso de solicitação](https://github.com/aws/aws-sdk-java-v2/issues/new)) | Incompatível ([recurso de solicitação](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 

# Alterações em waiters da versão 1 para a versão 2
<a name="migration-waiters"></a>

Este tópico detalha as alterações na funcionalidade dos waiters da versão 1 (v1) para a versão 2 (v2).

As tabelas a seguir demonstram a diferença especificamente para waiters do DynamoDB. Os waiters de outros serviços seguem o mesmo padrão.

## Alterações de alto nível
<a name="migration-waiters-api-changes"></a>

As aulas de waiters usam o mesmo artefato do Maven do serviço. 


| Alteração | v1 | v2 | 
| --- | --- | --- | 
|    Dependências do Maven  |  <pre><dependencyManagement><br />    <dependencies><br />        <dependency><br />            <groupId>com.amazonaws</groupId><br />            <artifactId>aws-java-sdk-bom</artifactId><br />            <version>1.12.6801</version><br />            <type>pom</type><br />            <scope>import</scope><br />        </dependency><br />    </dependencies><br /></dependencyManagement><br /><dependencies><br />    <dependency><br />        <groupId>com.amazonaws</groupId><br />        <artifactId>dynamodb</artifactId><br />    </dependency><br /></dependencies><br /></pre>  |  <pre><dependencyManagement><br />    <dependencies><br />        <dependency><br />            <groupId>software.amazon.awssdk</groupId><br />            <artifactId>bom</artifactId><br />            <version>2.27.102</version><br />            <type>pom</type><br />            <scope>import</scope><br />        </dependency><br />    </dependencies><br /></dependencyManagement><br /><dependencies><br />    <dependency><br />        <groupId>software.amazon.awssdk</groupId><br />        <artifactId>dynamodb</artifactId><br />    </dependency><br /></dependencies></pre>  | 
| Nome do pacote | com.amazonaws.services.dynamodbv2.waiters | software.amazon.awssdk.services.dynamodb.waiters | 
| Nomes da classe |  `[AmazonDynamoDBWaiters](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/waiters/AmazonDynamoDBWaiters.html)`  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/sdk-for-java/latest/developer-guide/migration-waiters.html)  | 

1 [Versão mais recente](https://central.sonatype.com/artifact/com.amazonaws/aws-java-sdk-bom). 2 [Versão mais recente](https://central.sonatype.com/artifact/software.amazon.awssdk/bom).

## Alterações de API
<a name="migration-cf-presign-behavior-changes"></a>


| Alteração | v1 | v2 | 
| --- | --- | --- | 
| Criar um waiter |  <pre>AmazonDynamoDB client = AmazonDynamoDBClientBuilder <br />                            .standard().build();<br />AmazonDynamoDBWaiters waiter = client.waiters();</pre>  | Síncrono:<pre>DynamoDbClient client = DynamoDbClient.create();<br />DynamoDbWaiter waiter = client.waiter();</pre>Assíncrono:<pre>DynamoDbAsyncClient asyncClient = <br />        DynamoDbAsyncClient.create();<br />DynamoDbAsyncWaiter waiter = asyncClient.waiter();</pre> | 
| Aguardar até existir uma tabela | Síncrono:<pre>waiter.tableExists()<br />    .run(new WaiterParameters<>(<br />        new DescribeTableRequest(tableName)));</pre>Assíncrono:<pre>waiter.tableExists()<br />    .runAsync(new WaiterParameters()<br />      .withRequest(new DescribeTableRequest(tableName)),<br />          new WaiterHandler() {<br />              @Override<br />              public void onWaitSuccess(<br />                  AmazonWebServiceRequest amazonWebServiceRequest) {<br />                    System.out.println("Table creation succeeded");<br />              }<br /><br />              @Override<br />              public void onWaitFailure(Exception e) {<br />                  e.printStackTrace();<br />              }<br />          }).get();</pre> |  Síncrono: <pre>WaiterResponse<DescribeTableResponse> waiterResponse =<br />    waiter.waitUntilTableExists(<br />        r -> r.tableName("myTable"));<br />waiterResponse.matched().response()<br />       .ifPresent(System.out::println);</pre> Assíncrono: <pre>waiter.waitUntilTableExists(r -> r.tableName(tableName))<br />           .whenComplete((r, t) -> {<br />               if (t != null) {<br />                   t.printStackTrace();<br />               } else {<br />                   System.out.println(<br />                        "Table creation succeeded");<br />               }<br />           }).join();</pre>  | 

## Alterações de configuração
<a name="migration-waiters-config"></a>


| Alteração | v1 | v2 | 
| --- | --- | --- | 
| Estratégia de sondagem (máximo de tentativas e atraso fixo) |  <pre>MaxAttemptsRetryStrategy maxAttemptsRetryStrategy = <br />        new MaxAttemptsRetryStrategy(10);<br /><br />FixedDelayStrategy fixedDelayStrategy = <br />        new FixedDelayStrategy(3);<br /><br />PollingStrategy pollingStrategy = <br />        new PollingStrategy(maxAttemptsRetryStrategy, <br />                fixedDelayStrategy);<br /><br />waiter.tableExists().run(<br />        new WaiterParameters<>(<br />            new DescribeTableRequest(tableName)), <br />                pollingStrategy);</pre>  |  <pre><br />FixedDelayBackoffStrategy fixedDelayBackoffStrategy = <br />        FixedDelayBackoffStrategy<br />            .create(Duration.ofSeconds(3));<br /><br />waiter.waitUntilTableExists(r -> r.tableName(tableName),<br />        c -> c.maxAttempts(10)<br />                .backoffStrategy(fixedDelayBackoffStrategy));</pre>  | 

# Alterações no utilitário de metadados do EC2 da versão 1 para a versão 2
<a name="migration-imds"></a>

Este tópico detalha as alterações no utilitário de metadados Amazon Elastic Compute Cloud (EC2) do SDK para Java da versão 1 (v1) para a versão 2 (v2).

## Alterações de alto nível
<a name="migration-imds-high-level-changes"></a>


****  

| Alteração | v1 |  v2 da  | 
| --- | --- | --- | 
|    Dependências do Maven  |  <pre><dependencyManagement><br />    <dependencies><br />        <dependency><br />            <groupId>com.amazonaws</groupId><br />            <artifactId>aws-java-sdk-bom</artifactId><br />            <version>1.12.5871</version><br />            <type>pom</type><br />            <scope>import</scope><br />        </dependency><br />    </dependencies><br /></dependencyManagement><br /><dependencies><br />    <dependency><br />        <groupId>com.amazonaws</groupId><br />        <artifactId>aws-java-sdk-core</artifactId><br />    </dependency><br /></dependencies></pre>  |  <pre><dependencyManagement><br />    <dependencies><br />        <dependency><br />            <groupId>software.amazon.awssdk</groupId><br />            <artifactId>bom</artifactId><br />            <version>2.27.212</version><br />            <type>pom</type><br />            <scope>import</scope><br />        </dependency><br />    </dependencies><br /></dependencyManagement><br /><dependencies><br />    <dependency><br />        <groupId>software.amazon.awssdk</groupId><br />        <artifactId>imds</artifactId><br />    </dependency><br />    <dependency><br />        <groupId>software.amazon.awssdk</groupId><br />        <artifactId>apache-client3</artifactId><br />    </dependency><br /></dependencies></pre>  | 
| Nome do pacote |  com.amazonaws.util  |  software.amazon.awssdk.imds  | 
| Abordagem de instanciação |  Use métodos de utilitário estático; sem instanciação: <pre>String localHostName = <br />           EC2MetadataUtils.getLocalHostName();</pre>  |  Use um método estático de fábrica: <pre>Ec2MetadataClient client = Ec2MetadataClient.create();</pre> Ou use uma abordagem de criador: <pre>Ec2MetadataClient client = Ec2MetadataClient.builder()<br />    .endpointMode(EndpointMode.IPV6)<br />    .build();</pre>  | 
| Tipos de clientes | Somente métodos de utilitário síncronos: EC2MetadataUtils |  Síncrono: `Ec2MetadataClient` Assíncrono: `Ec2MetadataAsyncClient`  | 

1 [Versão mais recente](https://central.sonatype.com/artifact/com.amazonaws/aws-java-sdk-bom). 2 [Versão mais recente](https://central.sonatype.com/artifact/software.amazon.awssdk/bom).

3 Observe a declaração do módulo `apache-client` para v2. A V2 do utilitário de metadados do EC2 requer uma implementação da interface `SdkHttpClient` para o cliente de metadados síncronos ou da interface `SdkAsyncHttpClient` para o cliente de metadados assíncronos. A seção [Configure clientes HTTP no AWS SDK for Java 2.x](http-configuration.md) mostra a lista de clientes HTTP que você pode usar.

### Solicitar metadados
<a name="migration-imds-fetching-changes"></a>

Na v1, você deve usar métodos estáticos que não aceitem parâmetros para solicitar metadados para um recurso do EC2. Por outro lado, é necessário especificar o caminho para o recurso do EC2 como um parâmetro na v2. A tabela a seguir mostra as diferentes abordagens.


****  

| v1 |  v2 da  | 
| --- | --- | 
|  <pre>String userMetaData = EC2MetadataUtils.getUserData();</pre>  |  <pre>Ec2MetadataClient client = Ec2MetadataClient.create();<br />Ec2MetadataResponse response = <br />                client.get("/latest/user-data");<br />String userMetaData = <br />                response.asString();</pre>  | 

Consulte as [categorias de metadados da instância](https://docs.aws.amazon.com//AWSEC2/latest/UserGuide/instancedata-data-categories.html) para encontrar o caminho que você precisa fornecer para solicitar uma parte dos metadados. 

**nota**  
Ao usar um cliente de metadados de instância na v2, é necessário usar o mesmo cliente para todas as solicitações para recuperação de metadados.

 

## Mudanças de comportamento
<a name="migration-imds-behavior-changes"></a>

### Dados JSON
<a name="migration-imds-behavior-json"></a>

No EC2, o serviço de metadados de instância (IMDS) em execução local exibe alguns metadados como strings formatadas em JSON. Um exemplo são os metadados dinâmicos de um [documento de identidade de instância](https://docs.aws.amazon.com//AWSEC2/latest/UserGuide/instance-identity-documents.html).

A API da v1 contém métodos separados para cada parte dos metadados de identidade da instância, enquanto a API da v2 exibe diretamente a string JSON. Para trabalhar com a string JSON, é possível usar a [API de documento](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/core/document/package-summary.html) para analisar a resposta e navegar pela estrutura JSON.

A tabela a seguir compara como recuperar metadados de um documento de identidade de instância na v1 e na v2.


****  

| Caso de uso | v1 |  v2 da  | 
| --- | --- | --- | 
| Recuperar a região |  <pre>InstanceInfo instanceInfo = <br />        EC2MetadataUtils.getInstanceInfo();<br />String region = instanceInfo.getRegion();</pre>  |  <pre>Ec2MetadataResponse response = <br />    client.get("/latest/dynamic/instance-identity/document");<br />Document instanceInfo = response.asDocument();<br />String region = instanceInfo.asMap().get("region").asString();</pre>  | 
| Recupere o ID da instância |  <pre>InstanceInfo instanceInfo = <br />        EC2MetadataUtils.getInstanceInfo();<br />String instanceId = instanceInfo.instanceId;</pre>  |  <pre>Ec2MetadataResponse response = <br />    client.get("/latest/dynamic/instance-identity/document");<br />Document instanceInfo = response.asDocument();<br />String instanceId = instanceInfo.asMap().get("instanceId").asString();</pre>  | 
| Recupere o tipo da instância |  <pre>InstanceInfo instanceInfo = <br />        EC2MetadataUtils.getInstanceInfo();<br />String instanceType = instanceInfo.instanceType();</pre>  |  <pre>Ec2MetadataResponse response = <br />    client.get("/latest/dynamic/instance-identity/document");<br />Document instanceInfo = response.asDocument();<br />String instanceType = instanceInfo.asMap().get("instanceType").asString();</pre>  | 

### Diferenças na resolução do endpoint
<a name="migration-imds-behavior-endpoint-res"></a>

A tabela a seguir mostra os locais que o SDK confere para resolver o endpoint para o IMDS. Os locais são listados em ordem decrescente em termos de prioridade.


****  

| v1 |  v2 da  | 
| --- | --- | 
| Propriedade do sistema: com.amazonaws.sdk.ec2MetadataServiceEndpointOverride | Método de configuração do criador do cliente: endpoint(...) | 
| Variável de ambiente: AWS\$1EC2\$1METADATA\$1SERVICE\$1ENDPOINT | Propriedade do sistema: aws.ec2MetadataServiceEndpoint | 
| Valor padrão: http://169.254.169.254 | Arquivo de configuração: \$1.aws/config com a configuração ec2\$1metadata\$1service\$1endpoint | 
|  | Valor associado ao endpoint-mode resolvido  | 
|  | Valor padrão: http://169.254.169.254 | 

### Resolução de endpoint na v2
<a name="migration-imds-behavior-endpoint-res2"></a>

Quando você define explicitamente um endpoint usando o criador, esse valor de endpoint tem prioridade sobre todas as outras configurações. Quando o código a seguir é executado, a propriedade do sistema `aws.ec2MetadataServiceEndpoint` e a definição do arquivo de configuração `ec2_metadata_service_endpoint` serão ignoradas, se existirem.

```
Ec2MetadataClient client = Ec2MetadataClient
  .builder()
  .endpoint(URI.create("endpoint.to.use"))
  .build();
```

#### Modo de endpoint
<a name="migration-imds-behavior-endpoint-mode"></a>

Com a v2, você pode especificar um modo de endpoint para configurar o cliente de metadados para usar os valores de endpoint padrão para ou. IPv4 IPv6 O modo de endpoint não está disponível para a v1. O valor padrão usado para IPv4 é `http://169.254.169.254` e `http://[fd00:ec2::254]` para IPv6.

A tabela a seguir mostra as diferentes maneiras pelas quais é possível definir o modo de endpoint em ordem decrescente em termos de prioridade.


****  

|  |  | Possíveis valores | 
| --- | --- | --- | 
| Método de configuração do criador do cliente: endpointMode(...) |  <pre>Ec2MetadataClient client = Ec2MetadataClient<br />  .builder()<br />  .endpointMode(EndpointMode.IPV4)<br />  .build();</pre>  | EndpointMode.IPV4, EndpointMode.IPV6 | 
| Propriedades do sistema | aws.ec2MetadataServiceEndpointMode | IPv4, IPv6 (o uso de maiúsculas ou minúsculas não importa) | 
| Arquivo de configuração: \$1.aws/config | Configuração da ec2\$1metadata\$1service\$1endpoint | IPv4, IPv6 (o uso de maiúsculas ou minúsculas não importa) | 
| Não especificado nas formas anteriores | IPv4 é usado |  | 

#### Como o SDK resolve `endpoint` ou `endpoint-mode` na v2
<a name="migration-imds-behavior-endpoint-res2-which"></a>

1. O SDK usa o valor definido no código no criador do cliente e ignora todas as configurações externas. Como o SDK vai gerar uma exceção se `endpoint` e `endpointMode` forem chamados no criador do cliente, o SDK usará o valor do endpoint de qualquer método usado.

1. Se você não definir um valor no código, o SDK examinará a configuração externa: primeiro as propriedades do sistema e depois uma configuração no arquivo de configuração. 

   1. O SDK primeiro confere o valor de um endpoint. Se um valor for encontrado, ele será usado. 

   1. Se o SDK ainda não encontrou um valor, ele procurará as configurações do modo de endpoint.

1. Por fim, se o SDK não encontrar configurações externas e você não tiver configurado o cliente de metadados no código, o SDK usará o IPv4 valor de. `http://169.254.169.254`

### IMDSv2
<a name="migration-imds-behavior-imdsv2"></a>

O Amazon EC2 define duas abordagens para acessar os metadados da instância:
+ Serviço de metadados de instância versão 1 (IMDSv1) — abordagem de solicitação/resposta
+ Instance Metadata Service versão 2 (IMDSv2) — abordagem orientada a sessões

A tabela a seguir compara como o Java SDKs funciona com o IMDS.


****  

| v1 |  v2 da  | 
| --- | --- | 
| IMDSv2 é usado por padrão | Sempre usa IMDSv2 | 
| Tenta buscar um token de sessão para cada solicitação e retorna IMDSv1 se não conseguir obter um token de sessão | Mantém um token de sessão em um cache interno que é reutilizado para várias solicitações. | 

O SDK for Java 2.x oferece suporte IMDSv2 somente e não é compatível com o. IMDSv1

## Diferenças de configuração
<a name="migration-imds-config-diffs"></a>

A tabela a seguir lista as diferentes opções de configuração.


****  

| Configuração | v1 |  v2 da  | 
| --- | --- | --- | 
| Novas tentativas | Configuração não disponível | Configurável por meio do método do criador retryPolicy(...) | 
| HTTP | Tempo limite de conexão configurável por meio da variável de ambiente AWS\$1METADATA\$1SERVICE\$1TIMEOUT. O padrão é 1 segundo. | Configuração disponível ao transmitir um cliente HTTP para o método do criador httpClient(...). O tempo limite de conexão padrão para clientes HTTP é de 2 segundos. | 

### Exemplo de configuração de HTTP v2
<a name="migration-imds-http-conf-v2-ex"></a>

O exemplo a seguir mostra como configurar o cliente de metadados. Este exemplo configura o tempo limite de conexão e usa o cliente do Apache HTTP.

```
SdkHttpClient httpClient = ApacheHttpClient.builder()
    .connectionTimeout(Duration.ofSeconds(1))
    .build();

Ec2MetadataClient imdsClient = Ec2MetadataClient.builder()
    .httpClient(httpClient)
    .build();
```

# Alterações na CloudFront pré-assinatura da Amazon da versão 1 para a versão 2
<a name="migration-cloudfront-presigning"></a>

Este tópico detalha as mudanças na Amazon CloudFront da versão 1 (v1) para a versão 2 (v2).

## Alterações de alto nível
<a name="migration-cloudfront-presigning-api-changes"></a>


****  

| Alteração | v1 |  v2 da  | 
| --- | --- | --- | 
|    Dependências do Maven  |  <pre><dependencyManagement><br />    <dependencies><br />        <dependency><br />            <groupId>com.amazonaws</groupId><br />            <artifactId>aws-java-sdk-bom</artifactId><br />            <version>1.12.5871</version><br />            <type>pom</type><br />            <scope>import</scope><br />        </dependency><br />    </dependencies><br /></dependencyManagement><br /><dependencies><br />    <dependency>  <br />        <groupId>com.amazonaws</groupId><br />        <artifactId>cloudfront</artifactId><br />    </dependency><br /></dependencies></pre>  |  <pre><dependencyManagement><br />    <dependencies><br />        <dependency><br />            <groupId>software.amazon.awssdk</groupId><br />            <artifactId>bom</artifactId><br />            <version>2.27.212</version><br />            <type>pom</type><br />            <scope>import</scope><br />        </dependency><br />    </dependencies><br /></dependencyManagement><br /><dependencies><br />    <dependency><br />        <groupId>software.amazon.awssdk</groupId><br />        <artifactId>cloudfront</artifactId><br />    </dependency><br /></dependencies></pre>  | 
| Nome do pacote | com.amazonaws.services.cloudfront | software.amazon.awssdk.services.cloudfront | 
| Nomes da classe |  [CloudFrontUrlSigner](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/cloudfront/CloudFrontUrlSigner.html) [CloudFrontCookieSigner](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/cloudfront/CloudFrontCookieSigner.html)  |  [CloudFrontUtilities](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/cloudfront/CloudFrontUtilities.html) [SignedUrl](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/cloudfront/url/SignedUrl.html) [CannedSignerRequest](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/cloudfront/model/CannedSignerRequest.html) [CustomSignerRequest](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/cloudfront/model/CustomSignerRequest.html)  | 

1 [Versão mais recente](https://central.sonatype.com/artifact/com.amazonaws/aws-java-sdk-bom). 2 [Versão mais recente](https://central.sonatype.com/artifact/software.amazon.awssdk/bom).

## Alterações de API
<a name="migration-cf-presign-behavior-changes"></a>


| Comportamento | v1 |  v2 da  | 
| --- | --- | --- | 
| Criar uma solicitação predefinida | Os argumentos são passados diretamente para a API. |  <pre>CannedSignerRequest cannedRequest =<br />      CannedSignerRequest.builder()<br />                         .resourceUrl(resourceUrl)<br />                         .privateKey(privateKey)<br />                         .keyPairId(keyPairId)<br />                         .expirationDate(expirationDate)<br />                         .build();</pre>  | 
| Criar uma solicitação personalizada | Os argumentos são passados diretamente para a API. |  <pre>CustomSignerRequest customRequest =<br />      CustomSignerRequest.builder()<br />                         .resourceUrl(resourceUrl)<br />                         .resourceUrlPattern(resourceUrlPattern)<br />                         .privateKey(keyFile)<br />                         .keyPairId(keyPairId)<br />                         .expirationDate(expirationDate)<br />                         .activeDate(activeDate)<br />                         .ipRange(ipRange)<br />                         .build();</pre>  | 
| Gerar um URL assinado (predefinido) |  <pre>String signedUrl =<br />  CloudFrontUrlSigner.getSignedURLWithCannedPolicy(<br />    resourceUrl, keyPairId, privateKey, expirationDate);</pre>  |  <pre>CloudFrontUtilities cloudFrontUtilities =<br />    CloudFrontUtilities.create();<br /><br />SignedUrl signedUrl =        <br />    cloudFrontUtilities.getSignedUrlWithCannedPolicy(cannedRequest);<br /><br />String url = signedUrl.url();<br /></pre>  | 
| Gerar um cookie assinado (personalizado) |  <pre>CookiesForCustomPolicy cookies =<br />    CloudFrontCookieSigner.getCookiesForCustomPolicy(<br />        resourceUrl, privateKey, keyPairId, expirationDate, <br />        activeDate, ipRange);<br /></pre>  |  <pre>CloudFrontUtilities cloudFrontUtilities =<br />    CloudFrontUtilities.create();<br /><br />CookiesForCustomPolicy cookies =<br />     cloudFrontUtilities.getCookiesForCustomPolicy(customRequest);<br /></pre>  | 

### Cabeçalhos de cookies refatorados na v2
<a name="migration-cf-presign-behavior-headers"></a>

No Java v1, o Java SDK fornece cabeçalhos de cookies como um `Map.Entry<String, String>`.

```
Map.Entry<String, String> signatureMap = cookies.getSignature();
String signatureKey = signatureMap.getKey(); // "CloudFront-Signature"
String signatureValue = signatureMap.getValue(); // "[SIGNATURE_VALUE]"
```

O Java v2 SDK fornece o cabeçalho inteiro como um único `String`.

```
String signatureHeaderValue = cookies.signatureHeaderValue(); // "CloudFront-Signature=[SIGNATURE_VALUE]"
```

# Alterações da API do Compilador de Políticas do IAM da versão 1 para a versão 2
<a name="migration-iam-policy-builder"></a>

Este tópico detalha as alterações na API do Compilador de Políticas do IAM da versão 1 (v1) para a versão 2 (v2).

## Alterações de alto nível
<a name="migration-iam-policy-builder-high-level"></a>


****  

| Alteração | v1 |  v2 da  | 
| --- | --- | --- | 
|    Dependências do Maven  |  <pre><dependencyManagement><br />    <dependencies><br />        <dependency><br />            <groupId>com.amazonaws</groupId><br />            <artifactId>aws-java-sdk-bom</artifactId><br />            <version>1.12.5871</version><br />            <type>pom</type><br />            <scope>import</scope><br />        </dependency><br />    </dependencies><br /></dependencyManagement><br /><dependencies><br />    <dependency><br />        <groupId>com.amazonaws</groupId><br />        <artifactId>aws-java-sdk-core</artifactId><br />    </dependency><br /></dependencies></pre>  |  <pre><dependencyManagement><br />    <dependencies><br />        <dependency><br />            <groupId>software.amazon.awssdk</groupId><br />            <artifactId>bom</artifactId><br />            <version>2.27.212</version><br />            <type>pom</type><br />            <scope>import</scope><br />        </dependency><br />    </dependencies><br /></dependencyManagement><br /><dependencies><br />    <dependency><br />        <groupId>software.amazon.awssdk</groupId><br />        <artifactId>iam-policy-builder</artifactId><br />    </dependency><br /></dependencies></pre>  | 
| Nome do pacote | com.amazonaws.auth.policy | software.amazon.awssdk.policybuilder.iam | 
| Nomes da classe |  [Política](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/policy/Policy.html) [Instrução](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/policy/Statement.html) [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/sdk-for-java/latest/developer-guide/migration-iam-policy-builder.html)  |  [IamPolicy](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/policybuilder/iam/IamPolicy.html) [IamStatement](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/policybuilder/iam/IamStatement.html) [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/sdk-for-java/latest/developer-guide/migration-iam-policy-builder.html)  | 

1 [Versão mais recente](https://central.sonatype.com/artifact/com.amazonaws/aws-java-sdk-bom). 2 [Versão mais recente](https://central.sonatype.com/artifact/software.amazon.awssdk/bom).

## Alterações de API
<a name="migration-iam-policy-builder-api"></a>


****  

| Configuração | v1 |  v2 da  | 
| --- | --- | --- | 
|  Instanciar uma política |  <pre>Policy policy = new Policy();</pre>  |  <pre>IamPolicy.Builder policyBuilder = IamPolicy.builder();<br />...<br />IamPolicy policy = policyBuilder.build();</pre>  | 
|    Definir ID  |  <pre>policy.withtId(...);<br />policy.setId(...);</pre>  |  <pre>policyBuilder.id(...);</pre>  | 
|    Definir versão  | N/A: usa a versão padrão de 2012-10-17 |  <pre>policyBuilder.version(...);</pre>  | 
|    Criar declaração  |  <pre>Statement statement = <br />    new Statement(Effect.Allow)<br />            .withActions(...)<br />            .withConditions(...)<br />            .withId(...)<br />            .withPrincipals(...)<br />            .withResources(...);</pre>  |  <pre>IamStatement statement = <br />    IamStatement.builder()<br />            .effect(IamEffect.ALLOW)<br />            .actions(...)<br />            .notActions(...)<br />            .conditions(...)<br />            .sid(...)<br />            .principals(...)<br />            .notPrincipals(...)<br />            .resources(...)<br />            .notResources(...)<br />            .build()</pre>  | 
|    Definir declaração  |  <pre>policy.withStatements(statement);<br />policy.setStatements(statement);</pre>  |  <pre>policyBuilder.addStatement(statement);</pre>  | 

## Diferenças na construção de uma declaração
<a name="migration-iam-policy-builder-statement"></a>

### Ações
<a name="migration-iam-policy-builder-statement-actions"></a>

#### v1
<a name="migration-iam-policy-builder-statement-actions.v1"></a>

O SDK v1 tem [tipos de `enum`](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/policy/Action.html) para ações de serviço que representam elementos `[https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_action.html](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_action.html)` em uma declaração de política. Os tipos de `enum` a seguir são alguns exemplos.
+ `[IdentityManagementActions](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/policy/actions/IdentityManagementActions.html)`
+ `[DynamoDBv2Actions](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/policy/actions/DynamoDBv2Actions.html)`
+ `[SQSActions](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/policy/actions/SQSActions.html)`

O exemplo a seguir mostra a constante `SendMessage` para `SQSActions`.

```
Action action = SQSActions.SendMessage;
```

Você não pode especificar um elemento `[https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_notaction.html](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_notaction.html)` para uma declaração na v1.

#### v2 da
<a name="migration-iam-policy-builder-statement-actions.v2"></a>

Na v2, a [IamAction](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/policybuilder/iam/IamAction.html)interface representa todas as ações. Para especificar um elemento de [ação específico do serviço](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_action.html), passe uma string para o método `create` conforme mostrado no código a seguir.

```
IamAction action = IamAction.create("sqs:SendMessage");
```

Você pode especificar um `[https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_notaction.html](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_notaction.html)` para uma declaração com v2, como mostra o código a seguir.

```
IamAction action = IamAction.create("sqs:SendMessage");
IamStatement.builder().addNotAction(action);
```

### Condições
<a name="migration-iam-policy-builder-statement-conditions"></a>

#### v1
<a name="migration-iam-policy-builder-statement-conditions-v1"></a>

Para representar as condições da declaração, o SDK v1 usa subclasses de [https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/policy/Condition.html](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/policy/Condition.html). 
+  [ArnCondition](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/policy/conditions/ArnCondition.html) 
+  [BooleanCondition](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/policy/conditions/BooleanCondition.html)
+  [DateCondition](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/policy/conditions/DateCondition.html)
+ [IpAddressCondition](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/policy/conditions/IpAddressCondition.html)
+ [NumericCondition](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/policy/conditions/NumericCondition.html)
+ [ StringCondition ](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/policy/conditions/StringCondition.html)

Cada subclasse `Condition` define um tipo `enum` de comparação para ajudar a definir a condição. Por exemplo, veja a seguir uma [comparação de string](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String) do tipo *diferente de* para uma condição.

```
Condition condition = new StringCondition(StringComparisonType.StringNotLike, "key", "value");
```

#### v2 da
<a name="migration-iam-policy-builder-statement-conditions-v2"></a>

Na v2, você cria uma condição para uma declaração de política usando `[IamCondition](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/policybuilder/iam/IamCondition.html)` e fornece um `[IamConditionOperator](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/policybuilder/iam/IamConditionOperator.html)`, que contém `enums` para todos os tipos.

```
IamCondition condition = IamCondition.create(IamConditionOperator.STRING_NOT_LIKE, "key", "value");
```

### Recursos
<a name="migration-iam-policy-builder-statement-resources"></a>

#### v1
<a name="migration-iam-policy-builder-statement-resources-v1"></a>

O elemento `[https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_resource.html](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_resource.html)` de uma declaração de política é representado pela classe `[Resource](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/policy/Resource.html)` do SDK. Você fornece o ARN como uma string no construtor. As subclasses a seguir fornecem construtores de conveniência.
+ [S3BucketResource](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/policy/resources/S3BucketResource.html)
+ [S3ObjectResource](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/policy/resources/S3ObjectResource.html)
+ [SQSQueueRecurso](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/policy/resources/SQSQueueResource.html)

Na v1, você pode especificar um elemento `[https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_notresource.html](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_notresource.html)` para um `[Resource](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/policy/Resource.html)` chamando o método `withIsNotType` conforme mostrado na declaração a seguir.

```
Resource resource = new Resource("arn:aws:s3:::amzn-s3-demo-bucket").withIsNotType(true);
```

#### v2 da
<a name="migration-iam-policy-builder-statement-resources-v2"></a>

Na v2, você cria um elemento `[https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_resource.html](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_resource.html)` passando um ARN para o método `IamResource.create`.

```
IamResource resource = IamResource.create("arn:aws:s3:::amzn-s3-demo-bucket");
```

Um `[IamResource](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/policybuilder/iam/IamResource.html)` pode ser definido como o elemento *[https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_notresource.html](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_notresource.html)*, conforme mostrado no trecho a seguir.

```
IamResource resource = IamResource.create("arn:aws:s3:::amzn-s3-demo-bucket");
IamStatement.builder().addNotResource(resource);
```

`IamResource.ALL` representa todos os recursos. 

### Entidades principais
<a name="migration-iam-policy-builder-statement-principal"></a>

#### v1
<a name="migration-iam-policy-builder-statement-principal-v1"></a>

O SDK v1 oferece as seguintes classes `[Principal](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/policy/Principal.html)` para representar tipos de entidades principais que incluem todos os membros:
+ `AllUsers`
+ `AllServices`
+ `AllWebProviders`
+ `All`

Você não pode adicionar um elemento `[https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_notprincipal.html](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_notprincipal.html)` a uma declaração.

#### v2 da
<a name="migration-iam-policy-builder-statement-principal-v2"></a>

Na v2, `IamPrincipal.ALL` representa todas as entidades principais:

Para representar todos os membros em outros tipos de entidades principais, use as classes `[IamPrincipalType](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/policybuilder/iam/IamPrincipalType.html)` ao criar um `IamPrincipal`.
+ `IamPrincipal.create(IamPrincipalType.AWS,"*")` para todos os usuários.
+ `IamPrincipal.create(IamPrincipalType.SERVICE,"*")` para todos os serviços.
+ `IamPrincipal.create(IamPrincipalType.FEDERATED,"*")` para todos os provedores da web.
+ `IamPrincipal.create(IamPrincipalType.CANONICAL_USER,"*")` para todos os usuários canônicos.

Você pode usar o método `addNotPrincipal` para representar um elemento `[https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_notprincipal.html](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_notprincipal.html)` ao criar uma declaração de política, conforme mostrado na declaração a seguir.

```
IamPrincipal principal = IamPrincipal.create(IamPrincipalType.AWS, "arn:aws:iam::444455556666:root");
IamStatement.builder().addNotPrincipal(principal);
```

# Alterações no trabalho com o DynamoDB da versão 1 para a versão 2 do AWS SDK para Java
<a name="migration-ddb-mapper"></a>



**Topics**
+ [

# Diferenças da API de mapeamento do DynamoDB entre a versão 1 e a versão 2 do AWS SDK para Java
](ddb-mapping.md)
+ [

# Documente as diferenças da API entre a versão 1 e a versão 2 do AWS SDK para Java
](dynamodb-mapping-document-api.md)
+ [

# Migração da biblioteca de criptografia
](ddb-encryption-lib-migrate.md)

# Diferenças da API de mapeamento do DynamoDB entre a versão 1 e a versão 2 do AWS SDK para Java
<a name="ddb-mapping"></a>

O APIs mapeamento do DynamoDB mudou significativamente entre a versão 1 e a versão 2 do. AWS SDK para Java Na versão 1, você usa o `DynamoDBMapper` para trabalhar com Java POJOs. Na versão 2, você usa o `DynamoDbEnhancedClient` com nomes de métodos atualizados, opções aprimoradas de definição de esquema e segurança de tipo aprimorada.

As principais diferenças incluem:
+ Novos nomes de métodos (como `getItem` em vez de `load`)
+ Criação explícita de esquema de tabela
+ Suporte incorporado para operações síncronas e assíncronas
+ Mudanças na forma como as strings vazias e a configuração são tratadas

Esta seção aborda as alterações da API de mapeamento, as diferenças de anotação, as atualizações de configuração e as diretrizes de migração para ajudar você a fazer a transição de `DynamoDBMapper` v1 para `DynamoDbEnhancedClient` v2.

**Contents**
+ [

# Alterações de alto nível nas bibliotecas de mapeamento da versão 1 para a versão 2 do SDK para Java
](dynamodb-mapping-high-level.md)
  + [

## Importar diferenças de dependência
](dynamodb-mapping-high-level.md#dynamodb-mapping-deps)
+ [

# Alterações no APIs mapeamento do DynamoDB entre a versão 1 e a versão 2 do SDK for Java
](dynamodb-mapping-api-changes.md)
  + [

## Criar um cliente
](dynamodb-mapping-api-changes.md#dynamodb-mapping-api-changes-client)
  + [

## Estabelecer o mapeamento para tabela/índice do DynamoDB
](dynamodb-mapping-api-changes.md#dynamodb-mapping-api-changes-mapping)
  + [

## Operações de tabela
](dynamodb-mapping-api-changes.md#dynamodb-mapping-api-changes-tobleops)
  + [

## Classes e propriedades de mapa
](dynamodb-mapping-api-changes.md#dynamodb-mapping-schemas)
    + [

### Anotações de bean
](dynamodb-mapping-api-changes.md#dynamodb-mapping-schemas-annos)
    + [

### Anotações adicionais da V2
](dynamodb-mapping-api-changes.md#dynamodb-mapping-schemas-annos-v2-addnl)
  + [

## Configuração
](dynamodb-mapping-api-changes.md#dynamodb-mapping-configuration)
    + [

### Configuração por operação
](dynamodb-mapping-api-changes.md#dynamodb-mapping-configuration-per-op)
  + [

## Condicionais
](dynamodb-mapping-api-changes.md#dynamodb-mapping-conditionals)
  + [

## Conversão de tipo
](dynamodb-mapping-api-changes.md#dynamodb-mapping-type-conv)
    + [

### Conversores padrão
](dynamodb-mapping-api-changes.md#dynamodb-mapping-type-conv-defaults)
    + [

### Definir um conversor personalizado para um atributo
](dynamodb-mapping-api-changes.md#dynamodb-mapping-type-conv-anno)
    + [

### Adicionar uma fábrica ou fornecedor de conversor de tipo
](dynamodb-mapping-api-changes.md#dynamodb-mapping-type-conv-factory)
+ [

# Diferenças de gerenciamento de strings entre a versão 1 e a versão 2 do SDK para Java
](dynamodb-migration-string-handling.md)
+ [

# Diferenças de bloqueio positivo entre a versão 1 e a versão 2 do SDK para Java
](dynamodb-migrate-optimstic-locking.md)
+ [

# Diferenças de setters fluentes entre a versão 1 e a versão 2 do SDK para Java
](dynamodb-migrate-fluent-setters.md)

# Alterações de alto nível nas bibliotecas de mapeamento da versão 1 para a versão 2 do SDK para Java
<a name="dynamodb-mapping-high-level"></a>

Os nomes do cliente de mapeamento em cada biblioteca diferem da V1 para a V2:
+ V1 - Dínamo DBMapper
+ V2: Cliente Aprimorado do DynamoDB

Você interage com as duas bibliotecas da mesma forma: instancia uma mapper/client e, em seguida, fornece um Java POJO para APIs essa leitura e gravação desses itens nas tabelas do DynamoDB. Ambas as bibliotecas também oferecem anotações para a classe do POJO para direcionar como o cliente lida com o POJO. 

As principais diferenças quando você muda para a V2 incluem:
+ A V2 e a V1 usam nomes de métodos diferentes para as operações de baixo nível do DynamoDB. Por exemplo:    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/sdk-for-java/latest/developer-guide/dynamodb-mapping-high-level.html)
+ A V2 oferece várias maneiras de definir esquemas de tabela e POJOs mapear para tabelas. Você pode escolher entre o uso de anotações ou um esquema gerado a partir do código usando um compilador. A V2 também oferece versões mutáveis e imutáveis dos esquemas.
+ Com a V2, você cria especificamente o esquema da tabela como uma das primeiras etapas, enquanto na V1, o esquema da tabela é inferido da classe anotada conforme necessário.
+ A V2 inclui o [cliente da API de documentos](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/enhanced/dynamodb/document/EnhancedDocument.html) na API de cliente aprimorado, enquanto a V1 usa uma [API separada](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/document/DynamoDB.html).
+ Todos APIs estão disponíveis nas versões síncrona e assíncrona na V2.

Consulte informações mais detalhadas sobre o cliente aprimorado da V2 na [seção de mapeamento do DynamoDB](dynamodb-enhanced-client.md) deste guia.

## Importar diferenças de dependência
<a name="dynamodb-mapping-deps"></a>


| V1 | V2 | 
| --- | --- | 
|  <pre><dependencyManagement><br />  <dependencies><br />    <dependency><br />      <groupId>com.amazonaws</groupId><br />      <artifactId>aws-java-sdk-bom</artifactId><br />      <version>1.X.X</version><br />      <type>pom</type><br />      <scope>import</scope><br />    </dependency><br />  </dependencies><br /></dependencyManagement> <br /><br /><dependencies><br />  <dependency><br />    <groupId>com.amazonaws</groupId><br />    <artifactId>aws-java-sdk-dynamodb</artifactId><br />  </dependency><br /></dependencies></pre>  |  <pre><dependencyManagement><br />  <dependencies><br />    <dependency><br />      <groupId>software.amazon.awssdk</groupId><br />      <artifactId>bom</artifactId><br />      <version>2.X.X*</version><br />      <type>pom</type><br />      <scope>import</scope><br />    </dependency><br />  </dependencies><br /></dependencyManagement> <br /><br /><dependencies><br />  <dependency><br />    <groupId>software.amazon.awssdk</groupId><br />    <artifactId>dynamodb-enhanced</artifactId><br />  </dependency><br /></dependencies></pre>  | 

\$1 [Versão mais recente](https://central.sonatype.com/artifact/software.amazon.awssdk/bom)

Na V1, uma única dependência inclui tanto a API de baixo nível do DynamoDB quanto a API, enquanto na V2, você usa mapping/document `dynamodb-enhanced` a dependência do artefato para acessar a API. mapping/document O módulo `dynamodb-enhanced` contém uma dependência transitiva do módulo de baixo nível`dynamodb`. 

# Alterações no APIs mapeamento do DynamoDB entre a versão 1 e a versão 2 do SDK for Java
<a name="dynamodb-mapping-api-changes"></a>

## Criar um cliente
<a name="dynamodb-mapping-api-changes-client"></a>


****  

| Caso de uso | V1 | V2 | 
| --- | --- | --- | 
|   Instanciação normal  |  <pre>AmazonDynamoDB standardClient = AmazonDynamoDBClientBuilder.standard()<br />    .withCredentials(credentialsProvider)<br />    .withRegion(Regions.US_EAST_1)<br />    .build();<br />DynamoDBMapper mapper = new DynamoDBMapper(standardClient);</pre>  |  <pre>DynamoDbClient standardClient = DynamoDbClient.builder()<br />    .credentialsProvider(ProfileCredentialsProvider.create())<br />    .region(Region.US_EAST_1)<br />    .build();<br />DynamoDbEnhancedClient enhancedClient = DynamoDbEnhancedClient.builder()<br />    .dynamoDbClient(standardClient)<br />    .build();</pre>  | 
|   Instanciação mínima  |  <pre>AmazonDynamoDB standardClient = AmazonDynamoDBClientBuilder.standard();<br />DynamoDBMapper mapper = new DynamoDBMapper(standardClient);</pre>  |  <pre>DynamoDbEnhancedClient enhancedClient = DynamoDbEnhancedClient.create();</pre>  | 
|   Com transformador de atributo\$1  |  <pre>DynamoDBMapper mapper = new DynamoDBMapper(standardClient, <br />                        attributeTransformerInstance);</pre>  |  <pre>DynamoDbEnhancedClient enhancedClient = DynamoDbEnhancedClient.builder()<br />    .dynamoDbClient(standardClient)<br />    .extensions(extensionAInstance, extensionBInstance)<br />    .build();</pre>  | 

\$1As extensões na V2 correspondem aproximadamente aos transformadores de atributos na V1. A seção [Usar extensões para personalizar as operações do Cliente Aprimorado do DynamoDB](ddb-en-client-extensions.md) contém mais informações sobre extensões na V2. 

## Estabelecer o mapeamento para tabela/índice do DynamoDB
<a name="dynamodb-mapping-api-changes-mapping"></a>

Na V1, você especifica um nome de tabela do DynamoDB por meio de uma anotação de bean. Na V2, um método de fábrica, `table()`, produz uma instância de `DynamoDbTable` que representa a tabela remota do DynamoDB. O primeiro parâmetro do método `table()` é o nome da tabela do DynamoDB.


****  

| Caso de uso | V1 | V2 | 
| --- | --- | --- | 
|   Mapear a classe Java POJO para a tabela do DynamoDB  |  <pre>@DynamoDBTable(tableName ="Customer")<br />public class Customer {<br />  ...<br />}</pre>  |  <pre>DynamoDbTable<Customer> customerTable = enhancedClient.table("Customer",<br />    TableSchema.fromBean(Customer.class));</pre>  | 
|   Mapear para um índice secundário do DynamoDB  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/sdk-for-java/latest/developer-guide/dynamodb-mapping-api-changes.html) A seção do Guia do desenvolvedor do DynamoDB que discute[ o método `query` da V1](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBMapper.Methods.html#DynamoDBMapper.Methods.query) mostra um exemplo completo.  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/sdk-for-java/latest/developer-guide/dynamodb-mapping-api-changes.html) A seção [Usar índices secundários](ddb-en-client-use-secindex.md) deste guia fornece mais informações.  | 

## Operações de tabela
<a name="dynamodb-mapping-api-changes-tobleops"></a>

Esta seção descreve as operações APIs que diferem entre V1 e V2 na maioria dos casos de uso padrão. 

Na V2, todas as operações que envolvem uma única tabela são chamadas na instância `DynamoDbTable`, não no cliente aprimorado. O cliente aprimorado contém métodos que podem ter como destino várias tabelas. 

Na tabela chamada *Operações de tabela* abaixo, uma instância POJO é chamada de `item` ou como um tipo específico, como `customer1`. Para os exemplos da V2 de as instâncias nomeadas, `table` é o resultado de uma chamada anterior a `enhancedClient.table()` que retorna uma referência à instância `DynamoDbTable`.

Observe que a maioria das operações da V2 pode ser chamada com um padrão de consumidor fluente, mesmo quando não mostrado. Por exemplo,

```
Customer customer = table.getItem(r → r.key(key));
  or
Customer customer = table.getItem(r → r.key(k -> k.partitionValue("id").sortValue("email")))
```

Para operações da V1, as *Operações de tabela* (abaixo) contêm algumas das formas mais usadas, mas não todas as formas com sobrecargas. Por exemplo, o método `load()` tem as seguintes sobrecargas:

```
mapper.load(Customer.class, hashKey)
mapper.load(Customer.class, hashKey, rangeKey)
mapper.load(Customer.class, hashKey, config)
mapper.load(Customer.class, hashKey, rangeKey, config)
mapper.load(item)
mapper.load(item, config)
```

As *Operações de tabela* (abaixo) mostram as formas comumente usados:

```
mapper.load(item)
mapper.load(item, config)
```


**Operações de tabela**  

| Caso de uso | V1 | V2 | 
| --- | --- | --- | 
|  Gravar um Java POJO em uma tabela do DynamoDB **Operação do DynamoDB:** `PutItem`, `UpdateItem`  |  <pre>mapper.save(item)<br />mapper.save(item, config)<br />mapper.save(item, saveExpression, config)</pre> Na V1, `DynamoDBMapperConfig.SaveBehavior` e anotações determinam qual método de baixo nível do DynamoDB será chamado. Em geral, `UpdateItem` é chamado, exceto quando se usa `SaveBehavior.CLOBBER` e `SaveBehavior.PUT`. As chaves geradas automaticamente são um caso de uso especial e, ocasionalmente, tanto `PutItem` como `UpdateItem` são usadas.  |  <pre>table.putItem(putItemRequest)<br />table.putItem(item)<br />table.putItemWithResponse(item) //Returns metadata.<br /><br />updateItem(updateItemRequest)<br />table.updateItem(item)<br />table.updateItemWithResponse(item) //Returns metadata.</pre>  | 
|  Ler um item de uma tabela do DynamoDB para um Java POJO **Operação do DynamoDB:** `GetItem`  |  <pre>mapper.load(item)<br />mapper.load(item, config)</pre>  |  <pre>table.getItem(getItemRequest)<br />table.getItem(item)<br />table.getItem(key)<br />table.getItemWithResponse(key) //Returns POJO with metadata.</pre>  | 
|  Excluir um item de uma tabela do DynamoDB **Operação do DynamoDB:** `DeleteItem`  |  <pre>mapper.delete(item, deleteExpression, config)</pre>  |  <pre>table.deleteItem(deleteItemRequest)<br />table.deleteItem(item)<br />table.deleteItem(key)</pre>  | 
|  Consultar uma tabela ou um índice secundário do DynamoDB e retornar uma lista paginada **Operação do DynamoDB:** `Query`  |  <pre>mapper.query(Customer.class, queryExpression)<br />mapper.query(Customer.class, queryExpression, <br />                             mapperConfig)</pre>  |  <pre>table.query(queryRequest)<br />table.query(queryConditional)</pre> Usar o `PageIterable.stream()` retornado (carregamento lento) para respostas sincronizadas e `PagePublisher.subscribe()` para respostas assíncronas  | 
|  Consultar uma tabela ou um índice secundário do DynamoDB e retornar uma lista **Operação do DynamoDB:** `Query`  |  <pre>mapper.queryPage(Customer.class, queryExpression)<br />mapper.queryPage(Customer.class, queryExpression, <br />                                 mapperConfig)</pre>  |  <pre>table.query(queryRequest)<br />table.query(queryConditional)</pre> Usar o `PageIterable.items()` retornado (carregamento lento) para respostas sincronizadas e `PagePublisher.items.subscribe()` para respostas assíncronas  | 
|  Verificar uma tabela ou um índice secundário do DynamoDB e retornar uma lista paginada **Operação do DynamoDB:** `Scan`  |  <pre>mapper.scan(Customer.class, scanExpression)<br />mapper.scan(Customer.class, scanExpression, <br />                            mapperConfig)</pre>  |  <pre>table.scan()<br />table.scan(scanRequest)</pre> Usar o `PageIterable.stream()` retornado (carregamento lento) para respostas sincronizadas e `PagePublisher.subscribe()` para respostas assíncronas  | 
|  Fazer uma varredura de uma tabela ou um índice secundário do DynamoDB e retornar uma lista **Operação do DynamoDB:** `Scan`  |  <pre>mapper.scanPage(Customer.class, scanExpression)<br />mapper.scanPage(Customer.class, scanExpression, <br />                                mapperConfig)</pre>  |  <pre>table.scan()<br />table.scan(scanRequest)</pre> Usar o `PageIterable.items()` retornado (carregamento lento) para respostas sincronizadas e `PagePublisher.items.subscribe()` para respostas assíncronas  | 
|  Ler vários itens de várias tabelas em um lote **Operação do DynamoDB:** `BatchGetItem`  |  <pre>mapper.batchLoad(Arrays.asList(customer1, <br />                               customer2, <br />                               book1))<br />mapper.batchLoad(itemsToGet) <br />           // itemsToGet: Map<Class<?>, List<KeyPair>></pre>  |  <pre>enhancedClient.batchGetItem(batchGetItemRequest)<br /><br />enhancedClient.batchGetItem(r -> r.readBatches(<br />    ReadBatch.builder(Record1.class)<br />             .mappedTableResource(mappedTable1)<br />             .addGetItem(i -> i.key(k -> k.partitionValue(0)))<br />             .build(),<br />    ReadBatch.builder(Record2.class)<br />             .mappedTableResource(mappedTable2)<br />             .addGetItem(i -> i.key(k -> k.partitionValue(0)))<br />             .build()))<br /><br />// Iterate over pages with lazy loading or over all items <br />   from the same table.</pre>  | 
|  Gravar vários itens em várias tabelas em um lote **Operação do DynamoDB:** `BatchWriteItem`  |  <pre>mapper.batchSave(Arrays.asList(customer1, <br />                               customer2, <br />                               book1)) </pre>  |  <pre>enhancedClient.batchWriteItem(batchWriteItemRequest)<br /><br />enhancedClient.batchWriteItem(r -> r.writeBatches(<br />    WriteBatch.builder(Record1.class)<br />             .mappedTableResource(mappedTable1)<br />             .addPutItem(item1)<br />             .build(),<br />    WriteBatch.builder(Record2.class)<br />             .mappedTableResource(mappedTable2)<br />             .addPutItem(item2)<br />             .build()))</pre>  | 
|  Excluir vários itens de várias tabelas em um lote **Operação do DynamoDB:** `BatchWriteItem`  |  <pre>mapper.batchDelete(Arrays.asList(customer1, <br />                                 customer2, <br />                                 book1)) </pre>  |  <pre>enhancedClient.batchWriteItem(r -> r.writeBatches(<br />    WriteBatch.builder(Record1.class)<br />             .mappedTableResource(mappedTable1)<br />             .addDeleteItem(item1key)<br />             .build(),<br />    WriteBatch.builder(Record2.class)<br />             .mappedTableResource(mappedTable2)<br />             .addDeleteItem(item2key)<br />             .build()))</pre>  | 
|  Gravar/excluir vários itens em um lote **Operação do DynamoDB:** `BatchWriteItem`  |  <pre>mapper.batchWrite(Arrays.asList(customer1, book1), <br />                  Arrays.asList(customer2)) </pre>  |  <pre>enhancedClient.batchWriteItem(r -> r.writeBatches(<br />    WriteBatch.builder(Record1.class)<br />             .mappedTableResource(mappedTable1)<br />             .addPutItem(item1)<br />             .build(),<br />    WriteBatch.builder(Record2.class)<br />             .mappedTableResource(mappedTable2)<br />             .addDeleteItem(item2key)<br />             .build()))</pre>  | 
|  Fazer uma gravação transacional **Operação do DynamoDB:** `TransactWriteItems`  |  <pre>mapper.transactionWrite(transactionWriteRequest)</pre>  |  <pre>enhancedClient.transactWriteItems(transasctWriteItemsRequest)</pre>  | 
|  Fazer uma leitura transacional **Operação do DynamoDB:** `TransactGetItems`  |  <pre>mapper.transactionLoad(transactionLoadRequest)</pre>  |  <pre>enhancedClient.transactGetItems(transactGetItemsRequest) </pre>  | 
|  Obter uma contagem de itens correspondentes de uma consulta **Operação do DynamoDB:** `Query` com `Select.COUNT`  |  <pre>mapper.count(Customer.class, queryExpression)</pre>  |  <pre>// Get the count from query results.<br />PageIterable<Customer> pageIterable =<br />    customerTable.query(QueryEnhancedRequest.builder()<br />        .queryConditional(queryConditional)<br />        .select(Select.COUNT)<br />        .build());<br />Iterator<Page<Customer>> iterator = pageIterable.iterator();<br />Page<Customer> page = iterator.next();<br />int count = page.count();<br /><br />// For a more concise approach, you can chain the method calls:<br />int count = customerTable.query(QueryEnhancedRequest.builder()<br />                .queryConditional(queryConditional)<br />                .select(Select.COUNT)<br />                .build())<br />            .iterator().next().count();</pre>  | 
|  Obter uma contagem de itens correspondentes de uma varredura **Operação do DynamoDB:** `Scan` com `Select.COUNT`  |  <pre>mapper.count(Customer.class, scanExpression)</pre>  |  <pre>// Get the count from scan results.<br />PageIterable<Customer> pageIterable =<br />    customerTable.scan(ScanEnhancedRequest.builder()<br />        .filterExpression(filterExpression)<br />        .select(Select.COUNT)<br />        .build());<br />Iterator<Page<Customer>> iterator = pageIterable.iterator();<br />Page<Customer> page = iterator.next();<br />int count = page.count();<br /><br />// For a more concise approach, you can chain the method calls:<br />int count = customerTable.scan(ScanEnhancedRequest.builder()<br />                .filterExpression(filterExpression)<br />                .select(Select.COUNT)<br />                .build())<br />            .iterator().next().count();</pre>  | 
|  Criar uma tabela no DynamoDB correspondente à classe POJO **Operação do DynamoDB:** `CreateTable`  |  <pre>mapper.generateCreateTableRequest(Customer.class)</pre> A declaração anterior gera uma solicitação de criação de tabela de baixo nível; os usuários devem chamar `createTable` no cliente do DynamoDB.  |  <pre>table.createTable(createTableRequest)<br /><br />table.createTable(r -> r.provisionedThroughput(defaultThroughput())<br />    .globalSecondaryIndices(<br />        EnhancedGlobalSecondaryIndex.builder()<br />            .indexName("gsi_1")<br />            .projection(p -> p.projectionType(ProjectionType.ALL))<br />            .provisionedThroughput(defaultThroughput())<br />            .build()));</pre>  | 
|  Fazer uma varredura paralela no DynamoDB **Operação do DynamoDB:** `Scan` com parâmetros `Segment` e `TotalSegments`  |  <pre>mapper.parallelScan(Customer.class, <br />                    scanExpression, <br />                    numTotalSegments)</pre>  |  Os usuários devem gerenciar as threads de operador e chamar `scan` para cada segmento: <pre>table.scan(r -> r.segment(0).totalSegments(5))</pre>  | 
|  Integrar o Amazon S3 com o DynamoDB para armazenar links inteligentes do S3  |  <pre>mapper.createS3Link(bucket, key)<br />mapper.getS3ClientCache()</pre>  |  Incompatível porque combina o Amazon S3 e o DynamoDB.  | 

## Classes e propriedades de mapa
<a name="dynamodb-mapping-schemas"></a>

Tanto na V1 quanto na V2, você mapeia classes para tabelas usando anotações no estilo bean. A V2 também [oferece outras formas de definir esquemas](ddb-en-client-adv-features.md#ddb-en-client-adv-features-schm-overview) para casos de uso específicos, como trabalhar com classes imutáveis.

### Anotações de bean
<a name="dynamodb-mapping-schemas-annos"></a>

A tabela a seguir mostra as anotações de bean equivalentes para um caso de uso específico que são usadas na V1 e na V2. Um cenário de classe `Customer` é usado para ilustrar os parâmetros.

As anotações, assim como as classes e enumerações, na V2 seguem a convenção camel case e usam '', não 'DynamoDB'. DynamoDb


| Caso de uso | V1 | V2 | 
| --- | --- | --- | 
| Mapear classe para tabela |  <pre>@DynamoDBTable (tableName ="CustomerTable")</pre>  | <pre>@DynamoDbBean<br />@DynamoDbBean(converterProviders = {...})</pre>O nome da tabela é definido ao chamar o método DynamoDbEnhancedClient\$1table(). | 
| Designar um membro da classe como um atributo da tabela  |  <pre>@DynamoDBAttribute(attributeName = "customerName")</pre>  |  <pre>@DynamoDbAttribute("customerName") </pre>  | 
| Designar um membro da classe é fundamental hash/partition  |  <pre>@DynamoDBHashKey </pre>  |  <pre>@DynamoDbPartitionKey</pre>  | 
| Designar um membro da classe é fundamental range/sort  |  <pre>@DynamoDBRangeKey </pre>  |  <pre>@DynamoDbSortKey </pre>  | 
| Designar um membro da classe é uma chave de partição/hash de índice secundário |  <pre>@DynamoDBIndexHashKey </pre>  |  <pre>@DynamoDbSecondaryPartitionKey </pre>  | 
| Designar um membro da classe é uma chave de classificação/intervalo de índice secundário |  <pre>@DynamoDBIndexRangeKey </pre>  |  <pre>@DynamoDbSecondarySortKey </pre>  | 
| Ignorar esse membro da classe ao mapear para uma tabela |  <pre>@DynamoDBIgnore </pre>  |  <pre>@DynamoDbIgnore</pre>  | 
| Designar um membro da classe como um atributo de chave UUID gerado automaticamente |  <pre>@DynamoDBAutoGeneratedKey</pre>  |  <pre>@DynamoDbAutoGeneratedUuid </pre> A extensão que fornece isso não é carregada por padrão; você deve adicionar a extensão ao compilador de cliente.  | 
| Designar um membro da classe como um atributo de carimbo de data e hora gerado automaticamente |  <pre>@DynamoDBAutoGeneratedTimestamp</pre>  |  <pre>@DynamoDbAutoGeneratedTimestampAttribute</pre> A extensão que fornece isso não é carregada por padrão; você deve adicionar a extensão ao compilador de cliente.  | 
| Designar um membro da classe como um atributo de versão incrementado automaticamente |  <pre>@DynamoDBVersionAttribute</pre>  |  <pre>@DynamoDbVersionAttribute</pre> A extensão que fornece isso é carregada automaticamente.  | 
| Designar um membro da classe como solicitando uma conversão personalizada |  <pre>@DynamoDBTypeConverted</pre>  |  <pre>@DynamoDbConvertedBy</pre>  | 
| Designar um membro da classe para ser armazenado como um tipo de atributo diferente |  <pre>@DynamoDBTyped(<DynamoDBAttributeType>)</pre>  |  Use uma implementação `AttributeConverter`. A V2 fornece muitos conversores incorporados para tipos de Java comuns. Você também pode implementar seu próprio `AttributeConverter` ou `AttributeConverterProvider` personalizado. Veja [Conversão de atributo de controle](ddb-en-client-adv-features-conversion.md) neste guia.  | 
| Designar uma classe que possa ser serializada em um documento do DynamoDB (documento no estilo JSON) ou subdocumento  |  <pre>@DynamoDBDocument</pre>  | Use a API de documento aprimorado. Consulte os recursos a seguir:[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/sdk-for-java/latest/developer-guide/dynamodb-mapping-api-changes.html) | 

### Anotações adicionais da V2
<a name="dynamodb-mapping-schemas-annos-v2-addnl"></a>


| Caso de uso | V1 | V2 | 
| --- | --- | --- | 
| Designar um membro da classe para não ser armazenado como um atributo NULL se o valor Java for nulo | N/D |  <pre>@DynamoDbIgnoreNulls</pre>  | 
| Designar um membro da classe para ser um objeto vazio se todos os atributos forem nulos | N/D |  <pre>@DynamoDbPreserveEmptyObject</pre>  | 
| Designar uma ação especial de atualização para um membro da classe | N/D |  <pre>@DynamoDbUpdateBehavior</pre>  | 
| Designar uma classe imutável | N/D |  <pre>@DynamoDbImmutable</pre>  | 
| Designar um membro da classe como um atributo de contador incrementado automaticamente | N/D |  <pre>@DynamoDbAtomicCounter</pre> A extensão que fornece essa funcionalidade é carregada automaticamente.  | 

## Configuração
<a name="dynamodb-mapping-configuration"></a>

Na V1, você geralmente controla comportamentos específicos usando uma instância de `DynamoDBMapperConfig`. Você pode fornecer o objeto de configuração ao criar o mapeador ou ao fazer uma solicitação. Na V2, a configuração é específica para o objeto de solicitação da operação.


| Caso de uso | V1 | Padrão na V1 | V2 | 
| --- | --- | --- | --- | 
|  |  <pre>DynamoDBMapperConfig.builder()</pre>  |  |  | 
| Estratégia de load/write repetição em lote |  <pre>  .withBatchLoadRetryStrategy(loadRetryStrategy)</pre> <pre>  .withBatchWriteRetryStrategy(writeRetryStrategy)</pre>  | fazer novas tentativas de itens com falha | Configure a estratégia de novas tentativas no DynamoDBClient subjacente. Veja [Configure o comportamento de repetição no AWS SDK for Java 2.x](retry-strategy.md) neste guia. | 
| Leituras consistentes |  <pre>  .withConsistentReads(CONSISTENT)</pre>  | EVENTUAL | Por padrão, leituras consistentes são falsas para operações de leitura. Substitua por .consistentRead(true) no objeto de solicitação. | 
| Esquema de conversão com conjuntos de marshallers/unmarshallers |  <pre>  .withConversionSchema(conversionSchema)</pre> As implementações estáticas fornecem compatibilidade retroativa com versões mais antigas.  | V2\$1COMPATIBLE | Não aplicável. Esse é um recurso legado que se refere à forma como as versões mais antigas do DynamoDB (V1) armazenavam os tipos de dados, e esse comportamento não será preservado no cliente aprimorado. Um exemplo de comportamento no DynamoDB V1 é armazenar boolianos como número em vez de boolianos. | 
| Nomes das tabelas |  <pre>  .withObjectTableNameResolver()<br />  .withTableNameOverride() <br />  .withTableNameResolver()</pre> As implementações estáticas fornecem compatibilidade retroativa com versões mais antigas  | usar anotação ou suposição da classe |  O nome da tabela é definido ao chamar o método `DynamoDbEnhancedClient#table()`.  | 
| Estratégia de carregamento de paginação |  <pre>  .withPaginationLoadingStrategy(strategy)</pre>  As opções são: LAZY\$1`LOADING`, `EAGER_LOADING` ou `ITERATION_ONLY`  | LAZY\$1LOADING |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/sdk-for-java/latest/developer-guide/dynamodb-mapping-api-changes.html)  | 
| Solicitar coleta de métricas |  <pre>  .withRequestMetricCollector(collector)</pre>  | null | Use metricPublisher() em ClientOverrideConfiguration ao criar o cliente padrão do DynamoDB.  | 
| Comportamento de salvamento |  <pre>  .withSaveBehavior(SaveBehavior.CLOBBER) </pre> As opções são `UPDATE`, `CLOBBER`, `PUT`, `APPEND_SET` ou `UPDATE_SKIP_NULL_ATTRIBUTES`.  | UPDATE |  Na V2, você chama `putItem()` ou `updateItem()` explicitamente. `CLOBBER or PUT`: a ação correspondente na v2 está chamando `putItem()`. Não há configuração `CLOBBER` específica. `UPDATE`: Corresponde a `updateItem()` `UPDATE_SKIP_NULL_ATTRIBUTES`: Corresponde `updateItem()` a. Controle o comportamento da atualização com a configuração da solicitação `ignoreNulls` e a anotação/tag `DynamoDbUpdateBehavior`. `APPEND_SET`: incompatível  | 
| Fábrica de conversão de tipo |  <pre>  .withTypeConverterFactory(typeConverterFactory) </pre>  | conversores de tipo padrão |  Definir o bean usando <pre>@DynamoDbBean(converterProviders = {ConverterProvider.class, <br />        DefaultAttributeConverterProvider.class})</pre>  | 

### Configuração por operação
<a name="dynamodb-mapping-configuration-per-op"></a>

Na V1, algumas operações, como `query()`, são altamente configuráveis por meio de um objeto de “expressão” enviado à operação. Por exemplo:

```
DynamoDBQueryExpression<Customer> emailBwQueryExpr = new DynamoDBQueryExpression<Customer>()
    .withRangeKeyCondition("Email",
        new Condition()
            .withComparisonOperator(ComparisonOperator.BEGINS_WITH)
            .withAttributeValueList(
                new AttributeValue().withS("my")));

mapper.query(Customer.class, emailBwQueryExpr);
```

Na V2, em vez de usar um objeto de configuração, você define parâmetros no objeto de solicitação usando um compilador. Por exemplo:

```
QueryEnhancedRequest emailBw = QueryEnhancedRequest.builder()
    .queryConditional(QueryConditional
        .sortBeginsWith(kb -> kb
            .sortValue("my"))).build();

customerTable.query(emailBw);
```

## Condicionais
<a name="dynamodb-mapping-conditionals"></a>

Na V2, as expressões condicionais e de filtragem são expressas usando um objeto `Expression`, que encapsula a condição e o mapeamento de nomes e filtros. 


| Caso de uso | Operações | V1 | V2 | 
| --- | --- | --- | --- | 
| Condições de atributo esperadas | save(), delete(), query(), scan() |  <pre>new DynamoDBSaveExpression()<br />  .withExpected(Collections.singletonMap(<br />      "otherAttribute", new ExpectedAttributeValue(false)))<br />  .withConditionalOperator(ConditionalOperator.AND);</pre>  | Obsoleto; use ConditionExpression em vez disso. | 
| Expressão de condição | delete() |  <pre>deleteExpression.setConditionExpression("zipcode = :zipcode")<br />deleteExpression.setExpressionAttributeValues(...)<br /></pre>  |  <pre>Expression conditionExpression =<br />    Expression.builder()<br />        .expression("#key = :value OR #key1 = :value1")<br />        .putExpressionName("#key", "attribute")<br />        .putExpressionName("#key1", "attribute3")<br />        .putExpressionValue(":value", AttributeValues.stringValue("wrong"))<br />        .putExpressionValue(":value1", AttributeValues.stringValue("three"))<br />        .build();<br /><br />DeleteItemEnhancedRequest request = DeleteItemEnhancedRequest.builder()<br />         .conditionExpression(conditionExpression).build();</pre>  | 
| Expressão de filtro | query(), scan() |  <pre>scanExpression<br />  .withFilterExpression("#statename = :state")<br />  .withExpressionAttributeValues(attributeValueMapBuilder.build())<br />  .withExpressionAttributeNames(attributeNameMapBuilder.build())<br /></pre>  |  <pre>Map<String, AttributeValue> values = singletonMap(":key", stringValue("value"));<br />Expression filterExpression =<br />    Expression.builder()<br />        .expression("name = :key")<br />        .expressionValues(values)<br />        .build();<br />QueryEnhancedRequest request = QueryEnhancedRequest.builder()<br />    .filterExpression(filterExpression).build();<br /></pre>  | 
| Expressão de condição para consulta | query() |  <pre>queryExpression.withKeyConditionExpression()</pre>  |  <pre>QueryConditional keyEqual = QueryConditional.keyEqualTo(b -> b<br />                .partitionValue("movie01"));<br /><br />QueryEnhancedRequest tableQuery = QueryEnhancedRequest.builder()<br />                .queryConditional(keyEqual)<br />                .build();</pre>  | 

## Conversão de tipo
<a name="dynamodb-mapping-type-conv"></a>

### Conversores padrão
<a name="dynamodb-mapping-type-conv-defaults"></a>

Na V2, o SDK fornece um conjunto de conversores padrão para todos os tipos comuns. É possível alterar os conversores de tipo tanto no nível geral do provedor quanto em um único atributo. Você pode encontrar uma lista dos conversores disponíveis na referência da [AttributeConverter](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/enhanced/dynamodb/AttributeConverter.html)API.

### Definir um conversor personalizado para um atributo
<a name="dynamodb-mapping-type-conv-anno"></a>

Na V1, é possível e anotar um método getter com `@DynamoDBTypeConverted` para especificar a classe que é convertida entre o tipo de atributo Java e o tipo de atributo do DynamoDB. Por exemplo, um `CurrencyFormatConverter` que converte entre um tipo Java `Currency` e uma string do DynamoDB pode ser aplicada conforme mostrado no trecho a seguir.

```
@DynamoDBTypeConverted(converter = CurrencyFormatConverter.class)
public Currency getCurrency() { return currency; }
```

O equivalente da V2 do trecho anterior é mostrado abaixo.

```
@DynamoDbConvertedBy(CurrencyFormatConverter.class)
public Currency getCurrency() { return currency; }
```

**nota**  
Na V1, é possível aplicar a anotação ao próprio atributo, a um tipo ou a uma anotação definida pelo usuário. A V2 permite a aplicação da anotação somente ao getter.

### Adicionar uma fábrica ou fornecedor de conversor de tipo
<a name="dynamodb-mapping-type-conv-factory"></a>

Na V1, você pode fornecer seu próprio conjunto de conversores de tipo, ou substituir os tipos que forem importantes para você adicionando uma fábrica de conversores de tipo à configuração. A fábrica do conversor de tipos amplia `DynamoDBTypeConverterFactory` e as substituições são feitas obtendo uma referência ao conjunto padrão e ampliando-o. O trecho a seguir demonstra como fazer isso.

```
DynamoDBTypeConverterFactory typeConverterFactory =
    DynamoDBTypeConverterFactory.standard().override()
        .with(String.class, CustomBoolean.class, new DynamoDBTypeConverter<String, CustomBoolean>() {
            @Override
            public String convert(CustomBoolean bool) {
                return String.valueOf(bool.getValue());
            }
            @Override
            public CustomBoolean unconvert(String string) {
                return new CustomBoolean(Boolean.valueOf(string));
            }}).build();
DynamoDBMapperConfig config =
    DynamoDBMapperConfig.builder()
        .withTypeConverterFactory(typeConverterFactory)
        .build();
DynamoDBMapper mapperWithTypeConverterFactory = new DynamoDBMapper(dynamo, config);
```

A V2 fornece funcionalidade semelhante por meio da anotação `@DynamoDbBean`. Você pode fornecer um único `AttributeConverterProvider` ou uma cadeia de `AttributeConverterProvider`s ordenados. Observe que, se fornecer sua própria cadeia de provedores de conversão de atributos, você substituirá o provedor de conversão padrão, e deve incluí-lo na cadeia para usar os conversores de atributos. 

```
@DynamoDbBean(converterProviders = {
   ConverterProvider1.class, 
   ConverterProvider2.class,
   DefaultAttributeConverterProvider.class})
public class Customer {
  ...
}
```

A seção sobre [conversão de atributos](ddb-en-client-adv-features-conversion.md#ddb-en-client-adv-features-conversion-example) neste guia contém um exemplo completo para a V2.

# Diferenças de gerenciamento de strings entre a versão 1 e a versão 2 do SDK para Java
<a name="dynamodb-migration-string-handling"></a>

A V1 e a V2 gerenciam strings vazias de forma diferente ao enviar dados para o DynamoDB:
+ **V1**: converte strings vazias em valores nulos antes de enviar para o DynamoDB (resultando em nenhum atributo)
+ **V2**: envia strings vazias como valores reais de string vazias para o DynamoDB

**Importante**  
Depois de migrar para a V2, se você não quiser que strings vazias sejam armazenadas no DynamoDB, implemente conversores personalizados. Sem conversores personalizados, a V2 armazena strings vazias como atributos reais de string vazias nos itens do DynamoDB, o que difere do comportamento da V1 de omitir totalmente esses atributos.

**Example conversor personalizado para V2 que converte um atributo de string vazia em nulo**  

```
/**
 * Custom converter that maintains V1 behavior by converting empty strings to null values
 * when writing to DynamoDB, ensuring compatibility with existing data. No attribute will be saved to DynamoDB.
 */
public class NullifyEmptyStringConverter implements AttributeConverter<String> {
    @Override
    public AttributeValue transformFrom(String value) {
        if (value == null || value.isEmpty()) {
            return AttributeValue.builder().nul(true).build();
        }
        return AttributeValue.builder().s(value).build();
    }

    @Override
    public String transformTo(AttributeValue attributeValue) {
        if (attributeValue.nul()) {
            return null;
        }
        return attributeValue.s();
    }

    @Override
    public EnhancedType<String> type() {
        return EnhancedType.of(String.class);
    }

    @Override
    public AttributeValueType attributeValueType() {
        return AttributeValueType.S;
    }
}

// V2 usage:
@DynamoDbBean
public class Customer {
    private String name;

    @DynamoDbConvertedBy(NullifyEmptyStringConverter.class)
    public String getName() {
        return name;
    }
}
```



# Diferenças de bloqueio positivo entre a versão 1 e a versão 2 do SDK para Java
<a name="dynamodb-migrate-optimstic-locking"></a>

Tanto a V1 quanto a V2 implementam um bloqueio positivo com uma anotação de atributo que marca uma propriedade em sua classe de bean para armazenar o número da versão.


**Diferenças no comportamento de bloqueio positivo**  

|  | V1 | V2 | 
| --- | --- | --- | 
| Anotação da classe de bean | @DynamoDBVersionAttribute | @DynamoDbVersionAttribute (observe que V2 usa um “b” minúsculo) | 
| Salvamento inicial | Atributo do número da versão definido como 1. |  O valor inicial para o atributo de versão definido com `@DynamoDbVersionAttribute(startAt = X)`. O valor padrão é 0.  | 
| Atualizar | O atributo do número da versão será incrementado em 1 se a verificação condicional confirmar que o número da versão do objeto que está sendo atualizado corresponde ao número no banco de dados. |  O atributo do número da versão será incrementado se a verificação condicional confirmar que o número da versão do objeto que está sendo atualizado corresponde ao número no banco de dados. O atributo do número da versão incrementado pela opção `incrementBy` definida com `@DynamoDbVersionAttribute(incrementBy = X)`. O valor padrão é 1.  | 
| Delete | DynamoDBMapper adiciona uma verificação condicional de que o número da versão do objeto que está sendo excluído corresponde ao número da versão no banco de dados. |  A V2 não adiciona automaticamente condições para as operações de exclusão. Você deverá adicionar expressões condicionais manualmente se quiser controlar o comportamento de exclusão. No exemplo a seguir, `recordVersion` é o atributo da versão do bean. <pre>// 1. Read the item and get its current version.<br />Customer item = customerTable.getItem(Key.builder().partitionValue("someId").build());<br />AttributeValue currentVersion = item.getRecordVersion();<br /><br />// 2. Create conditional delete with the `currentVersion` value.<br />DeleteItemEnhancedRequest deleteItemRequest =<br />    DeleteItemEnhancedRequest.builder()<br />       .key(KEY)<br />       .conditionExpression(Expression.builder()<br />           .expression("recordVersion = :current_version_value")<br />           .putExpressionValue(":current_version_value", currentVersion)<br />           .build()).build();<br /><br />customerTable.deleteItem(deleteItemRequest);</pre>  | 
| Gravação transacional com verificação de condição | Você não pode usar uma classe de bean que esteja anotada com @DynamoDBVersionAttribute em um método addConditionCheck. | Você pode usar uma classe de bean com a anotação @DynamoDbVersionAttribute em um método de compilador addConditionCheck para uma solicitação transactWriteItems. | 
| Disable (Desabilitar) | Desabilite o bloqueio positivo alterando o valor da enumeração  DynamoDBMapperConfig.SaveBehavior de UPDATE para CLOBBER. |  Não use a anotação `@DynamoDbVersionAttribute`.  | 

# Diferenças de setters fluentes entre a versão 1 e a versão 2 do SDK para Java
<a name="dynamodb-migrate-fluent-setters"></a>

Você pode usar POJOs com configuradores fluentes na API de mapeamento do DynamoDB para V1 e com V2 desde a versão 2.30.29. 

Por exemplo, o POJO a seguir retorna uma instância `Customer` do método `setName`:

```
// V1

@DynamoDBTable(tableName ="Customer")
public class Customer{
  private String name;
  // Other attributes and methods not shown.
  public Customer setName(String name){
     this.name = name;
     return this;
  }
}
```

No entanto, se você usar uma versão da V2 anterior à 2.30.29, `setName` retornará uma instância `Customer` com um valor `name` de `null`.

```
// V2 prior to version 2.30.29.

@DynamoDbBean
public class Customer{
  private String name;
  // Other attributes and methods not shown.
  public Customer setName(String name){ 
     this.name = name;
     return this;  // Bug: returns this instance with a `name` value of `null`.
  }
}
```

```
// Available in V2 since version 2.30.29.

@DynamoDbBean
public class Customer{
  private String name;
  // Other attributes and methods not shown.
  public Customer setName(String name){ 
     this.name = name;
     return this;  // Returns this instance for method chaining with the `name` value set.
  }
}
```

# Documente as diferenças da API entre a versão 1 e a versão 2 do AWS SDK para Java
<a name="dynamodb-mapping-document-api"></a>

A API de documentos é compatível com o trabalho com documentos no estilo JSON como itens únicos em uma tabela do DynamoDB. A API de documentos da V1 tem uma API correspondente na V2, mas em vez de usar um cliente separado para a API de documentos, como na V1, a V2 incorpora recursos dessa API no cliente aprimorado do DynamoDB. 

Na V1, a classe [https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/document/Item.html](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/document/Item.html) representa um registro não estruturado de uma tabela do DynamoDB. Na V2, um registro não estruturado é representado por uma instância da classe [https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/enhanced/dynamodb/document/EnhancedDocument.html](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/enhanced/dynamodb/document/EnhancedDocument.html). Observe que as chaves primárias são definidas no esquema da tabela para a V2 e no próprio item na V1.

A tabela abaixo compara as diferenças entre o documento na V1 e APIs na V2.


| Caso de uso | V1 | V2 | 
| --- |--- |--- |
| Crie um cliente de documentos |  <pre>AmazonDynamoDB client = ... //Create a client.<br />DynamoDB documentClient = new DynamoDB(client);</pre>  |  <pre>// The V2 Document API uses the same DynamoDbEnhancedClient<br />// that is used for mapping POJOs.<br />DynamoDbClient standardClient = ... //Create a standard client.<br />DynamoDbEnhancedClient enhancedClient = ... // Create an enhanced client.<br /></pre>  | 
| Faça referência a uma tabela |  <pre>Table documentTable = docClient.documentClient("Person");</pre>  |  <pre>DynamoDbTable<EnhancedDocument> documentTable = enhancedClient.table("Person",  <br />        TableSchema.documentSchemaBuilder()<br />              .addIndexPartitionKey(TableMetadata.primaryIndexName(),"id", AttributeValueType.S)<br />              .attributeConverterProviders(AttributeConverterProvider.defaultProvider())<br />              .build());</pre>  | 
| **Work with semi-structured data** | 
| --- |
| Colocar item |  <pre>Item item = new Item()<br />      .withPrimaryKey("id", 50)<br />      .withString("firstName", "Shirley");<br />PutItemOutcome outcome = documentTable.putItem(item);</pre>  |  <pre>EnhancedDocument personDocument = EnhancedDocument.builder()<br />        .putNumber("id", 50)<br />        .putString("firstName", "Shirley")<br />        .build();<br />documentTable.putItem(personDocument);</pre>  | 
| Obter item |  <pre>GetItemOutcome outcome = documentTable.getItemOutcome( "id", 50);<br />Item personDocFromDb = outcome.getItem();<br />String firstName = personDocFromDb.getString("firstName");<br /></pre>  |  <pre>EnhancedDocument personDocFromDb = documentTable<br />        .getItem(Key.builder()<br />            .partitionValue(50)<br />            .build()); <br />String firstName = personDocFromDb.getString("firstName");<br /></pre>  | 
| **Work with JSON items** | 
| --- |
| Converter uma estrutura JSON para usá-la com a API Document |  <pre>// The 'jsonPerson' identifier is a JSON string. <br />Item item = new Item().fromJSON(jsonPerson);</pre>  |  <pre>// The 'jsonPerson' identifier is a JSON string.<br />EnhancedDocument document = EnhancedDocument.builder()<br />        .json(jsonPerson).build());</pre>  | 
| Coloque JSON |  <pre>documentTable.putItem(item)</pre>  |  <pre>documentTable.putItem(document);</pre>  | 
| Leia JSON |  <pre>GetItemOutcome outcome = //Get item.<br />String jsonPerson = outcome.getItem().toJSON();</pre>  |  <pre>String jsonPerson = documentTable.getItem(Key.builder()<br />        .partitionValue(50).build())<br />        .fromJson();</pre>  | 

## Referência de API e guias para documentos APIs
<a name="dynamodb-mapping-document-api-ref"></a>


|  | V1 | V2 | 
| --- | --- | --- | 
| Referência de API | [Referência de API](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/document/package-summary.html) | [Referência de API](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/enhanced/dynamodb/document/package-summary.html) | 
| Guia de documentação | [Guia do desenvolvedor do Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/JavaDocumentAPIItemCRUD.html) | [API de documentos aprimorados](ddb-en-client-doc-api.md) (este guia) | 

# API Xpec da V1 para API de expressões da V2
<a name="ddb-v1-xspec-migrate"></a>

A API de especificação de expressão (Xspec) disponível na V1, que ajuda a criar expressões para trabalhar com dados orientados a documentos, não está disponível na V2. A V2 usa a API Expression, que funciona com dados orientados a documentos e object-to-item dados mapeados.


****  

|  | V1 | V2 | 
| --- | --- | --- | 
| Nome da API | API de especificação de expressão (Xspec) | API de expressão | 
| Funciona com | Métodos da classe [Table](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/document/Table.html) da API de documentos, como [updateItem](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/document/Table.html#updateItem-java.lang.String-java.lang.Object-com.amazonaws.services.dynamodbv2.xspec.UpdateItemExpressionSpec-) e [scan](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/document/Table.html#scan-com.amazonaws.services.dynamodbv2.xspec.ScanExpressionSpec-) |  Ambos APIs do DynamoDB Enhanced Client: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/sdk-for-java/latest/developer-guide/ddb-v1-xspec-migrate.html) Para os dois tipos de APIs, depois de adquirir uma [https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/enhanced/dynamodb/DynamoDbTable.html](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/enhanced/dynamodb/DynamoDbTable.html)instância: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/sdk-for-java/latest/developer-guide/ddb-v1-xspec-migrate.html) você usa expressões em métodos `DynamoDbTable` ao criar objetos de solicitação. Por exemplo, no método `filterExpression` do [https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/enhanced/dynamodb/model/QueryEnhancedRequest.Builder.html](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/enhanced/dynamodb/model/QueryEnhancedRequest.Builder.html)  | 
| Recursos |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/sdk-for-java/latest/developer-guide/ddb-v1-xspec-migrate.html)  | [Informações sobre expressões](ddb-en-client-expressions.md) neste Guia do desenvolvedor do Java | 

# Migração da biblioteca de criptografia
<a name="ddb-encryption-lib-migrate"></a>

Consulte informações sobre a migração da biblioteca de criptografia do DynamoDB para trabalhar com a V2 do Java SDK no [Guia do desenvolvedor do Amazon DynamoDB Encryption Client](https://docs.aws.amazon.com/database-encryption-sdk/latest/devguide/ddb-java-migrate.html).

# Alterações no agrupamento em lotes automático de solicitações do Amazon SQS da versão 1 para a versão 2
<a name="migration-sqs-auto-batching"></a>

Este tópico detalha as alterações no agrupamento em lotes automático de solicitações para o Amazon SQS entre a versão 1 e a versão 2 do AWS SDK para Java.

## Alterações de alto nível
<a name="migration-sqs-auto-batching-high-level-changes"></a>

O AWS SDK para Java 1.x executa o buffer do lado do cliente usando uma `[AmazonSQSBufferedAsyncClient](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/sqs/buffered/AmazonSQSBufferedAsyncClient.html)` classe separada que requer inicialização explícita para o agrupamento de solicitações. 

Isso AWS SDK for Java 2.x simplifica e aprimora a funcionalidade de armazenamento em buffer com o. `[SqsAsyncBatchManager](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/sqs/batchmanager/SqsAsyncBatchManager.html)` A implementação dessa interface fornece recursos automáticos de envio em lotes de solicitações diretamente integrados ao `[SqsAsyncClient](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/sqs/SqsAsyncClient.html)` padrão. Para saber mais sobre `SqsAsyncBatchManager` da v2, consulte o tópico [Use o agrupamento automático de solicitações para o Amazon SQS com o AWS SDK for Java 2.x](sqs-auto-batch.md) deste guia.


| Alteração | v1 |  v2 da  | 
| --- | --- | --- | 
|    Dependências do Maven  |  <pre><dependencyManagement><br />    <dependencies><br />        <dependency><br />            <groupId>com.amazonaws</groupId><br />            <artifactId>aws-java-sdk-bom</artifactId><br />            <version>1.12.7821</version><br />            <type>pom</type><br />            <scope>import</scope><br />        </dependency><br />    </dependencies><br /></dependencyManagement><br /><dependencies><br />    <dependency><br />        <groupId>com.amazonaws</groupId><br />        <artifactId>aws-java-sdk-sqs</artifactId><br />    </dependency><br /></dependencies><br /></pre>  |  <pre><dependencyManagement><br />    <dependencies><br />        <dependency><br />            <groupId>software.amazon.awssdk</groupId><br />            <artifactId>bom</artifactId><br />            <version>2.31.152</version><br />            <type>pom</type><br />            <scope>import</scope><br />        </dependency><br />    </dependencies><br /></dependencyManagement><br /><dependencies><br />    <dependency><br />        <groupId>software.amazon.awssdk</groupId><br />        <artifactId>sqs</artifactId><br />    </dependency><br /></dependencies></pre>  | 
| Nomes do pacote | com.amazonaws.services.sqs.buffered | software.amazon.awssdk.services.sqs.batchmanager | 
| Nomes da classe |  `[AmazonSQSBufferedAsyncClient](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/sqs/buffered/AmazonSQSBufferedAsyncClient.html)`  | [SqsAsyncBatchManager](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/sqs/batchmanager/SqsAsyncBatchManager.html) | 

1 [Versão mais recente](https://central.sonatype.com/artifact/com.amazonaws/aws-java-sdk-bom). 2 [Versão mais recente](https://central.sonatype.com/artifact/software.amazon.awssdk/bom).

## Usar o agrupamento em lotes automático de solicitações do SQS
<a name="migration-sqs-auto-batching-using"></a>


| Alteração | v1 |  v2 da  | 
| --- | --- | --- | 
| Criar um gerenciador de lotes |  <pre>AmazonSQSAsync sqsAsync = new AmazonSQSAsyncClient();<br />AmazonSQSAsync bufferedSqs = new <br />            AmazonSQSBufferedAsyncClient(sqsAsync);</pre>  |  <pre>SqsAsyncClient asyncClient = SqsAsyncClient.create();<br />SqsAsyncBatchManager sqsAsyncBatchManager = <br />            asyncClient.batchManager();</pre>  | 
| Criar um gerenciador de lotes com configuração personalizada |  <pre>AmazonSQSAsync sqsAsync = new AmazonSQSAsyncClient();<br /><br />QueueBufferConfig queueBufferConfig = new QueueBufferConfig()<br />        .withMaxBatchOpenMs(200)<br />        .withMaxBatchSize(10)<br />        .withMinReceiveWaitTimeMs(1000)<br />        .withVisibilityTimeoutSeconds(20)<br />        .withReceiveMessageAttributeNames(messageAttributeValues);<br /><br />AmazonSQSAsync bufferedSqs = <br />        new AmazonSQSBufferedAsyncClient(sqsAsync, queueBufferConfig);</pre>  |  <pre>BatchOverrideConfiguration batchOverrideConfiguration = <br />    BatchOverrideConfiguration.builder()<br />        .sendRequestFrequency(Duration.ofMillis(200))<br />        .maxBatchSize(10)<br />        .receiveMessageMinWaitDuration(Duration.ofMillis(1000))<br />        .receiveMessageVisibilityTimeout(Duration.ofSeconds(20))<br />        .receiveMessageSystemAttributeNames(messageSystemAttributeNames)<br />        .receiveMessageAttributeNames(messageAttributeValues)<br />        .build();<br /><br />SqsAsyncBatchManager sqsAsyncBatchManager = SqsAsyncBatchManager.builder()<br />        .overrideConfiguration(batchOverrideConfiguration)<br />        .client(SqsAsyncClient.create())<br />        .scheduledExecutor(Executors.newScheduledThreadPool(8))<br />        .build();</pre>  | 
| Enviar mensagens |  <pre>Future<SendMessageResult> sendResultFuture = <br />        bufferedSqs.sendMessageAsync(new SendMessageRequest()<br />                .withQueueUrl(queueUrl)<br />                .withMessageBody(body));</pre>  |  <pre>CompletableFuture<SendMessageResponse> sendCompletableFuture = <br />        sqsAsyncBatchManager.sendMessage(<br />                SendMessageRequest.builder()<br />                        .queueUrl(queueUrl)<br />                        .messageBody(body)<br />                        .build());</pre>  | 
| Exclua mensagens |  <pre>Future<DeleteMessageResult> deletResultFuture =<br />        bufferedSqs.deleteMessageAsync(new DeleteMessageRequest()<br />                .withQueueUrl(queueUrl));</pre>  |  <pre>CompletableFuture<DeleteMessageResponse> deleteResultCompletableFuture<br />        = sqsAsyncBatchManager.deleteMessage(<br />                DeleteMessageRequest.builder()<br />                        .queueUrl(queueUrl)<br />                        .build());</pre>  | 
| Alterar a visibilidade das mensagens |  <pre>Future<ChangeMessageVisibilityResult> changeVisibilityResultFuture =<br />        bufferedSqs.changeMessageVisibilityAsync<br />                (new ChangeMessageVisibilityRequest()<br />                        .withQueueUrl(queueUrl)<br />                        .withVisibilityTimeout(20));</pre>  |  <pre>CompletableFuture<ChangeMessageVisibilityResponse> changeResponseCompletableFuture<br />        = sqsAsyncBatchManager.changeMessageVisibility(<br />                ChangeMessageVisibilityRequest.builder()<br />                        .queueUrl(queueUrl)<br />                        .visibilityTimeout(20)<br />                        .build());</pre>  | 
| Receber mensagens |  <pre>ReceiveMessageResult receiveResult =<br />        bufferedSqs.receiveMessage(<br />                new ReceiveMessageRequest()<br />                        .withQueueUrl(queueUrl));</pre>  |  <pre>CompletableFuture<ReceiveMessageResponse> <br />        responseCompletableFuture = sqsAsyncBatchManager.receiveMessage(<br />                ReceiveMessageRequest.builder()<br />                        .queueUrl(queueUrl)<br />                        .build());</pre>  | 

## Diferenças de tipo de retorno assíncrono
<a name="migration-sqs-auto-batching-asyc-return-type"></a>


| Alteração | v1 |  v2 da  | 
| --- | --- | --- | 
| Tipo de retorno | Future<ResultType> | CompletableFuture<ResponseType> | 
| Mecanismo de retorno de chamada | Requer um AsyncHandler com métodos onSuccess e onError separados | Usos CompletableFuture APIs fornecidos pelo JDK, comowhenComplete(), thenCompose() thenApply() | 
| Gerenciamento de exceções | Use o método AsyncHandler\$1onError() | Usos CompletableFuture APIs fornecidos pelo JDK, comoexceptionally(), ou handle() whenComplete() | 
| Cancelamento | Suporte básico por meio de Future.cancel() | O cancelamento de um CompletableFuture principal cancela automaticamente todos os futuros secundários na cadeia | 

## Diferenças de gerenciamento da conclusão assíncrona
<a name="migration-sqs-auto-batching-asyc-completion-handling"></a>


| Alteração | v1 |  v2 da  | 
| --- | --- | --- | 
| Implementação do gerenciador de resposta |  <pre>Future<ReceiveMessageResult> future = bufferedSqs.receiveMessageAsync(<br />        receiveRequest,<br />        new AsyncHandler<ReceiveMessageRequest, ReceiveMessageResult>() {<br />            @Override<br />            public void onSuccess(ReceiveMessageRequest request, <br />                              ReceiveMessageResult result) {<br />                List<Message> messages = result.getMessages();<br />                System.out.println("Received " + messages.size() + " messages");<br />                for (Message message : messages) {<br />                    System.out.println("Message ID: " + message.getMessageId());<br />                    System.out.println("Body: " + message.getBody());<br />                }<br />            }<br /><br />            @Override<br />            public void onError(Exception e) {<br />                System.err.println("Error receiving messages: " + e.getMessage());<br />                e.printStackTrace();<br />            }<br />        }<br />);</pre>  |  <pre>CompletableFuture<ReceiveMessageResponse> completableFuture = sqsAsyncBatchManager<br />               .receiveMessage(ReceiveMessageRequest.builder()<br />               .queueUrl(queueUrl).build())<br />        .whenComplete((receiveMessageResponse, throwable) -> {<br />            if (throwable != null) {<br />                System.err.println("Error receiving messages: " + throwable.getMessage());<br />                throwable.printStackTrace();<br />            } else {<br />                List<Message> messages = receiveMessageResponse.messages();<br />                System.out.println("Received " + messages.size() + " messages");<br />                for (Message message : messages) {<br />                    System.out.println("Message ID: " + message.messageId());<br />                    System.out.println("Body: " + message.body());<br />                }<br />            }<br />        });</pre>  | 

## Principais parâmetros de configuração
<a name="migration-sqs-auto-batching-params"></a>


****  

| Parâmetro | v1 |  v2 da  | 
| --- | --- | --- | 
| Tamanho máximo do lote | maxBatchSize (padrão de 10 solicitações por lote) | maxBatchSize (padrão de 10 solicitações por lote) | 
| Tempo de espera do lote | maxBatchOpenMs (padrão de 200 ms) | sendRequestFrequency (padrão de 200 ms) | 
| Tempo limite de visibilidade | visibilityTimeoutSeconds (-1 para a fila padrão) | receiveMessageVisibilityTimeout (fila padrão) | 
| Tempo mínimo de espera | longPollWaitTimeoutSeconds (20 s quando longPoll é verdadeiro) | receiveMessageMinWaitDuration (padrão de 50 ms) | 
| Atributos de mensagens | Definir usando ReceiveMessageRequest | receiveMessageAttributeNames (nenhum por padrão) | 
| Atributos do sistema | Definir usando ReceiveMessageRequest | receiveMessageSystemAttributeNames (nenhum por padrão) | 
| Sondagem longa | longPoll (o padrão é verdadeiro) | Não há suporte para evitar conexões abertas aguardando até o servidor enviar as mensagens | 
| Tempo máximo de espera para pesquisas longas | longPollWaitTimeoutSeconds (padrão de 20 s) | Não há suporte para evitar conexões abertas aguardando até o servidor enviar as mensagens | 
| O número máximo de lotes de recebimento pré-obtidos armazenados no lado do cliente. | maxDoneReceiveBatches (10 lotes) | Incompatível porque é gerenciado internamente | 
| Número máximo de lotes de saída ativos processados simultaneamente | maxInflightOutboundBatches (padrão de 5 lotes) | Incompatível porque é gerenciado internamente | 
| Número máximo de lotes de recebimento ativos processados simultaneamente | maxInflightReceiveBatches (padrão de 10 lotes) | Incompatível porque é gerenciado internamente | 

# Usar o SDK para Java 1.x e 2.x lado a lado
<a name="migration-side-by-side"></a>

Você pode usar as duas versões do AWS SDK para Java em seus projetos.

A seguir, um exemplo do arquivo `pom.xml` para um projeto que usa o Amazon S3 da versão 1.x e o DynamoDB da versão 2.27.21.

**Example Exemplo de POM**  
Este exemplo mostra uma entrada de arquivo `pom.xml` para um projeto que usa ambas as versões 1.x e 2.x do SDK.  

```
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.amazonaws</groupId>
            <artifactId>aws-java-sdk-bom</artifactId>
            <version>1.12.1</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <dependency>
          <groupId>software.amazon.awssdk</groupId>
          <artifactId>bom</artifactId>
          <version>2.27.21</version>
          <type>pom</type>
          <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<dependencies>
    <dependency>
      <groupId>com.amazonaws</groupId>
      <artifactId>aws-java-sdk-s3</artifactId>
    </dependency>
    <dependency>
      <groupId>software.amazon.awssdk</groupId>
      <artifactId>dynamodb</artifactId>
    </dependency>
</dependencies>
```