

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Migre de la versión 1.x a la 2.x del AWS SDK para Java
<a name="migration"></a>

La AWS SDK para Java versión 2.x es una importante reescritura del código base 1.x creado sobre Java 8\$1. Incluye muchas actualizaciones como, por ejemplo, coherencia mejorada, facilidad de uso e inmutabilidad sólidamente aplicada. En esta sección se describen las principales características nuevas de la versión 2.x y se explica cómo migrar el código de la versión 1.x a la 2.x.

**Topics**
+ [

## ¿Qué novedades incluye la versión 2?
](#migration-whats-new)
+ [Busque aplicaciones mediante clientes 1.x](migration-find-apps-using-v1.md)
+ [¿Cómo migrar?](migration-howto.md)
+ [Diferencias entre 1.x y 2.x](migration-whats-different.md)
+ [

# Utilizar el SDK para Java 1.x y 2.x en paralelo
](migration-side-by-side.md)

## ¿Qué novedades incluye la versión 2?
<a name="migration-whats-new"></a>
+ Puede configurar sus propios clientes HTTP. Consulte [Configuración del transporte HTTP](http-configuration.md).
+ Los clientes asíncronos cuentan con objetos de soporte y devolución sin bloqueo. I/O `CompletableFuture` Consulte [Programación asíncrona](asynchronous.md).
+ Las operaciones que devuelven varias páginas tienen respuestas paginadas automáticamente. De esta forma, puede centrar su código en qué hacer con la respuesta, sin necesidad de comprobar y obtener páginas posteriores. Consulte [Paginación](pagination.md). 
+ Se ha mejorado el rendimiento de las AWS Lambda funciones a la hora de inicio del SDK. Consulte [Mejoras en el rendimiento del tiempo de inicio del SDK](lambda-optimize-starttime.md). 
+ La versión 2.x admite un nuevo método abreviado para crear solicitudes.  
**Example**  

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

Para obtener más detalles sobre las nuevas características y ver ejemplos de código específicos, consulte las demás secciones de esta guía.
+  [Quick Start (Inicio rápido)](get-started.md) 
+  [Configuración](setup.md) 
+  [Ejemplos de código para la versión AWS SDK para Java 2.x](java_code_examples.md)
+  [Usar el SDK](using.md) 
+  [Seguridad para el AWS SDK para Java](security.md) 

# Encuentre aplicaciones mediante clientes AWS SDK para Java 1.x
<a name="migration-find-apps-using-v1"></a>

Antes de migrar a AWS SDK for Java 2.x, debe identificar qué aplicaciones de su entorno utilizan los clientes del SDK for Java 1.x. Puede usar CloudTrail los registros para rastrear el uso del SDK, buscar en los registros de las aplicaciones advertencias de obsolescencia, inspeccionar el código fuente y las configuraciones de compilación, o examinar los artefactos de Java que se pueden implementar. Utilice los métodos que estén disponibles en su entorno.

## Utilice CloudTrail Lake para buscar aplicaciones con clientes 1.x
<a name="migration-find-v1-apps-with-cloudtrail"></a>

AWS CloudTrail Lake le permite consultar los eventos registrados por CloudTrail. Siga estos pasos para crear un lago de datos que identifique las versiones del SDK que utilizan sus aplicaciones:

1. Cree un lago CloudTrail de datos. Consulte la [Guía del usuario](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/query-event-data-store.html) para crear un almacén de datos de eventos.

1. Después de crear el almacén de datos, examine el contenido del registro. El cuerpo del registro contiene campos que determinan la acción, el momento y la ubicación solicitados. Para obtener más información, consulte la [guía del usuario para ver el contenido de los CloudTrail registros](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-event-reference-record-contents.html).

1. Ejecute consultas con sus datos. Siga la [Guía del usuario para consultar y guardar los resultados de las consultas](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/query-run-query.html).

El campo *userAgent* de cada registro contiene la versión del SDK que realizó la solicitud. Utilice este campo para identificar las aplicaciones que utilizan SDK for Java 1.x.

La siguiente consulta de ejemplo busca todas las solicitudes de un EventDatastore ID `sample-Data-Store-Id` procedentes de aplicaciones de usuario y herramientas de terceros realizadas con el SDK para Java 1.x a partir del 17 de junio de 2025:

```
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
```

Un ejemplo del contenido del evento en el resultado de la consulta es el siguiente:

```
{
    "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"
}
```

Puede usar esta información para ayudar a determinar cuándo y dónde se realizó la solicitud.

En el ejemplo, se realizó una solicitud `ListTables` de DynamoDB en `2025-07-01 02:23:52 (UTC)` desde la dirección IP `12.345.6.78` con las credenciales del usuario de IAM llamado Alice. El valor del campo *UserAgent* muestra que la solicitud se realizó con la AWS SDK para Java versión `1.12.746` de un sistema Linux con JDK 11.

Para obtener una descripción de los campos del registro de AWS CloudTrail eventos, consulte el [contenido del CloudTrail registro de eventos de administración, datos y actividad de red](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-event-reference-record-contents.html).

Si no CloudTrail está activado en su cuenta, póngase en contacto con el administrador de AWS cuentas de su organización para activarlo o utilice uno de los métodos alternativos que se describen en las siguientes secciones.

CloudTrail Lake cobra por los datos ingeridos y escaneados por consulta. Para minimizar los costes, filtra las consultas por intervalos de tiempo y regiones específicos. Para conocer los precios actuales, consulte [Precios de AWS CloudTrail](https://aws.amazon.com/cloudtrail/pricing/).

## Busca en los registros de nivel de advertencia de las aplicaciones si el SDK está obsoleto
<a name="migration-find-v1-apps-log-warning"></a>

A partir de la versión 1.12.767 (publicada el 30 de julio de 2024), la versión AWS SDK para Java 1.x emite una advertencia de obsolescencia al iniciar la aplicación. Puede buscar esta advertencia en los registros de las aplicaciones para identificar qué aplicaciones y hosts utilizan SDK for Java 1.x.

La redacción exacta de la advertencia depende de la versión del SDK:
+ Versiones de la 1.12.767 a la 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...`
+ Versiones 1.12.797 y superiores:

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

El final `...` indica que el mensaje de advertencia continúa con texto adicional. Puede buscar el prefijo común `The AWS SDK for Java 1.x` para encontrar cualquier versión de la advertencia.

En el siguiente ejemplo, se muestra la búsqueda de esta advertencia mediante`grep`:

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

Si se encuentra la advertencia, el `grep` comando imprime las líneas de registro coincidentes. Si no se encuentra ninguna advertencia, la aplicación no utiliza el SDK for Java 1.x o utiliza una versión anterior a la 1.12.767. En ese caso, utilice uno de los otros métodos descritos en este documento.

## Busque el código fuente y las dependencias
<a name="migration-find-v1-apps-source-code"></a>

Puede buscar referencias a la versión 1.x en su base de código y en los archivos de configuración de compilación. AWS SDK para Java El identificador clave es el ID de `com.amazonaws` grupo, que utilizan todos los artefactos del SDK for Java 1.x.

En los siguientes ejemplos se muestra cómo `grep` se utiliza para buscar `com.amazonaws` referencias en archivos de proyectos Java comunes.

**Ejemplo: busque en los archivos fuente de Java las importaciones del SDK para Java 1.x (ejecutadas desde el directorio raíz del proyecto)**

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

Ejemplo de código de salida:

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

**nota**  
El `com.amazonaws` paquete también lo utilizan las bibliotecas que no forman parte del SDK para Java 1.x, como`aws-lambda-java-core`. Para confirmar que la importación proviene de SDK for Java 1.x, comprueba que el ID de artefacto correspondiente en tu configuración de administración de dependencias o de tu `pom.xml` configuración de administración de dependencias comience por. `build.gradle` `aws-java-sdk-`

**Ejemplo: busque en `pom.xml` archivos Maven las dependencias del SDK for Java 1.x (ejecutadas desde el directorio raíz del proyecto)**

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

Ejemplo de código de salida:

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

**Ejemplo: busca en archivos de compilación de Gradle las dependencias del SDK for Java 1.x (ejecutadas desde el directorio raíz del proyecto)**

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

Ejemplo de código de salida:

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

Los `grep` comandos anteriores identifican las referencias de SDK for Java 1.x declaradas directamente en los archivos fuente y de compilación. Sin embargo, es posible que tu aplicación también dependa del SDK for Java 1.x de forma transitiva, a través de una biblioteca de terceros que a su vez depende del SDK. Usa el árbol de dependencias de la herramienta de compilación para encontrar las dependencias directas y transitivas del SDK for Java 1.x. Elige el ejemplo que coincida con tu sistema de compilación.

**Ejemplo: Usa Maven para buscar todas las dependencias transitivas del SDK for Java 1.x (ejecutadas desde el directorio raíz del proyecto)**

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

Ejemplo de código de salida:

```
[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
```

La `-Dincludes=com.amazonaws` marca filtra el árbol para mostrar solo los artefactos del SDK for Java 1.x. En este ejemplo, `aws-java-sdk-s3` es una dependencia directa, pero `aws-java-sdk-dynamodb` es una dependencia transitiva introducida por. `some.thirdparty:library`

**Ejemplo: usa Gradle para buscar todas las dependencias transitivas del SDK for Java 1.x (se ejecutan desde el directorio raíz del proyecto)**

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

Ejemplo de código de salida:

```
+--- 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
```

Gradle no tiene un filtro de dependencias integrado equivalente al de Maven`-Dincludes`, por lo que canalizarlo es el enfoque más sencillo. `grep`

## Inspecciona los artefactos de Java desplegables
<a name="migration-find-v1-apps-inspect-artifacts"></a>

Puede inspeccionar los artefactos de Java desplegables (JARs WARs, o EARs) para confirmar si la versión AWS SDK para Java 1.x viene empaquetada con la aplicación. Los archivos de almacenamiento de Java son archivos en formato ZIP. Para determinar si SDK for Java 1.x está presente, busque el archivo `com/amazonaws/sdk/versionInfo.properties` dentro del archivo. Este archivo está incluido en el `aws-java-sdk-core` módulo y contiene el número de versión del SDK.

### Comprobación rápida con el `jar` comando
<a name="migration-find-v1-apps-jar-command"></a>

En el caso de los uber-jar, en los que todas las clases de dependencias se combinan en el nivel superior, muestre el contenido del archivo y busque el archivo de versión:

En los ejemplos siguientes, `myapp.jar` sustitúyalo por la ruta al archivo JAR de la aplicación.

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

Si el SDK está presente, el resultado es:

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

Si el `jar` comando no está disponible en su entorno (por ejemplo, imágenes de contenedor mínimas o solo en JRE), puede usar `unzip -l` en su lugar:

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

Para imprimir la versión:

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

Ejemplo de código de salida:

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

**nota**  
Los comandos anteriores solo buscan entradas de nivel superior en uber-jars. No encontrarán las clases de SDK compactas JARs (donde las dependencias son externas) ni dentro de las anidadas JARs (como las que se encuentran en WARs los paquetes Lambda o en o). EARs `lib/` `WEB-INF/lib/` En el caso de Thin JARs, comprueba la configuración de compilación (`pom.xml`,`build.gradle`) o el árbol de dependencias. En el caso de anidado JARs, busca el paquete JARs con una herramienta que pueda leer archivos ZIP de forma recursiva sin necesidad de extraerlos en el disco.

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

Puede migrar sus aplicaciones existentes del SDK para Java 1.x de dos formas.

1. Método automatizado mediante la [herramienta de migración](migration-tool.md).

1. [Método manual](migration-steps.md) reemplazando incrementalmente las importaciones de 1.x con importaciones de 2.x.

Le recomendamos que empiece utilizando la herramienta de migración. Automatiza gran parte de la rutina, el trabajo de reemplazo del código de 1.x a 2.x. 

Dado que la herramienta [no migra todas las características](migration-tool.md#migration-tool-limitations), deberá buscar el código restante de la v1 después de ejecutar la herramienta. Cuando encuentre un código que la herramienta no haya migrado, siga las [step-by-step instrucciones](migration-steps.md) (enfoque manual) y utilice los [artículos de la guía de migración](migration-whats-different.md) para finalizar la migración.

**Topics**
+ [Herramienta de migración](migration-tool.md)
+ [Step-by-step instrucciones](migration-steps.md)

# Herramienta de migración de AWS SDK para Java
<a name="migration-tool"></a>

AWS SDK para Java proporciona una herramienta de migración que ayuda a automatizar la migración del SDK para código Java 1.x (V1) a 2.x (V2). La herramienta utiliza [OpenRewrite](https://docs.openrewrite.org/), una herramienta de refactorización del código fuente abierto, para realizar la migración. OpenRewrite utiliza reglas de modificación de código (denominadas “fórmulas”) para actualizar automáticamente el código fuente de sintaxis y patrones de V1 a V2.

La herramienta admite las reglas de modificación de código para clientes de servicio del SDK y la biblioteca de alto nivel de [S3 Transfer Manager](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/transfer/TransferManager.html). No se admiten reglas de modificación de código para otras API de alto nivel, como [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) de la V1 a la [API DynamoDB Enhanced Client](dynamodb-enhanced-client.md) de la V2. 

Para obtener más información sobre las limitaciones, consulte el [final de esta página](#migration-tool-limitations). Para ver ejemplos detallados de patrones de código comunes no admitidos con pasos de migración manual, consulte [Patrones de código no admitidos](migration-tool-unsupported-patterns.md).

## Uso de la herramienta de migración
<a name="migration-tool-use"></a>

### Migración de un proyecto de Maven
<a name="migration-tool-use-maven"></a>

Siga las instrucciones que aparecen a continuación para migrar un proyecto basado en Maven del SDK para Java 1.x mediante la herramienta [Complemento OpenRewrite Maven](https://docs.openrewrite.org/reference/rewrite-maven-plugin).

1. Navegación al directorio raíz del proyecto de Maven

   Abra una ventana de terminal (línea de comandos) y acceda al directorio raíz de la aplicación basada en Maven.

1. Ejecución del comando `rewrite-maven-plugin` del plugin

   Puede elegir entre dos modos (objetivos de Maven): `dryRun` y `run`.

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

   En el modo `dryRun`, el complemento genera registros de diferencias en la salida de la consola y un archivo de parche llamado `rewrite.patch` en la carpeta `target/rewrite`. Este modo permite previsualizar los cambios que se realizarían, ya que no se realizan cambios en los archivos de código fuente. 

   El siguiente ejemplo muestra cómo invocar el complemento en 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
   ```

   \$1Sustituya *<rewrite-plugin-version>* por el valor `rewriteMavenPluginVersion` que aparece en este [archivo de prueba](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\$1Sustituya *<sdkversion>* por una versión 2.x del SDK. Visite [Central de Maven](https://central.sonatype.com/artifact/software.amazon.awssdk/v2-migration) para comprobar si hay una nueva versión. 
**importante**  
Asegúrese de usar la versión del `rewrite-maven-plugin` que se muestra en el [archivo de prueba](https://github.com/aws/aws-sdk-java-v2/blob/3a01289246f1f4ac814a354051d00030e53ef968/test/v2-migration-tests/src/test/java/software/amazon/awssdk/v2migrationtests/MavenTestBase.java#L54), ya que es posible que otras versiones no funcionen.

   La salida de la consola del modo `dryRun` debe ser similar a la siguiente.

   ```
   [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**

   Cuando ejecuta el complemento en modo `run`, se modifica el código fuente del disco para aplicar los cambios. Asegúrese de tener una copia de seguridad del código fuente antes de ejecutar el comando.

   El siguiente ejemplo muestra cómo invocar el complemento en 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
   ```

   \$1Sustituya <rewrite-plugin-version> por el `rewriteMavenPluginVersionvalue` que aparece en este [archivo de prueba](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\$1Sustituya *<sdkversion>* por una versión 2.x del SDK. Visite [Central de Maven](https://central.sonatype.com/artifact/software.amazon.awssdk/v2-migration) para comprobar si hay una nueva versión. 

   Tras ejecutar el comando, compile la aplicación y ejecute pruebas para comprobar los cambios. 

### Migración de un proyecto de Gradle
<a name="migration-tool-use-gradle"></a>

Siga las instrucciones que aparecen a continuación para migrar un proyecto basado en Gradle del SDK para Java 1.x mediante la herramienta [Complemento OpenRewrite Gradle](https://docs.openrewrite.org/reference/gradle-plugin-configuration).

1. Navegación al directorio raíz del proyecto de Gradle

   Abra una ventana de terminal (línea de comandos) y acceda al directorio raíz de la aplicación basada en Gradle.

1. Creación de un script de inicio de Gradle

   Cree un archivo `init.gradle` con el contenido siguiente en el directorio.

   ```
   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()
               }
           }
       }
   }
   ```

   \$1Sustituya *<rewrite-plugin-version>* por la versión que aparece en este [archivo de prueba](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. Ejecute el comando `rewrite`

   Al igual que con el complemento de Maven, puede ejecutar el complemento de Gradle en modo `dryRun` o `run`.

   **`dryRun` Modo**

   El siguiente ejemplo muestra cómo invocar el complemento en modo `dryRun`.

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

   **`run` Modo**

   El siguiente ejemplo muestra cómo invocar el complemento en modo `run`.

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

## Limitaciones actuales
<a name="migration-tool-limitations"></a>

Si bien la migración admite la mayor parte del código de la V1 mediante reglas de modificación de código que se actualizan al equivalente de la V2, algunas clases y métodos no están cubiertos. Para estas clases y métodos, siga las [instrucciones paso a paso](migration-steps.md) para migrar el código manualmente.

En el caso de algunas reglas de modificación de código no compatibles, la herramienta de migración puede agregar un comentario que comience por:

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

Tras el comentario, la herramienta genera un código auxiliar genérico de la versión V2 del método o la clase. Por ejemplo, en el siguiente resultado, la herramienta de migración intentó migrar el método `setBucketLifecycleConfiguration` del cliente V1 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());
```

Los enlaces de la lista siguiente le llevan a la información sobre migración para ayudarle a migrar el código manualmente.
+ [Diferencias del cliente S3 entre la versión 1 y la versión 2 del AWS SDK para Java](migration-s3-client.md)
+ [S3 Transfer Manager](migration-s3-transfer-manager.md) (TransferManager)
+ [Asignación de objetos de DynamoDB](migration-ddb-mapper.md) (DynamoDBMapper)
+ [Utilidad de metadatos de EC2](migration-imds.md) (EC2MetadataUtils)
+ [Esperadores](migration-waiters.md) (AmazonDynamoDBWaiters)
+ [Generador de políticas de IAM](migration-iam-policy-builder.md) (Policy)
+ [Prefirma de CloudFront](migration-cloudfront-presigning.md) (CloudFrontUrlSigner, CloudFrontCookieSigner)
+ [Notificaciones de eventos de S3](migration-s3-event-notification.md) (S3EventNotification)
+ Publicación de métricas de SDK ([documentación de 1.x](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/generating-sdk-metrics.html), [documentación de 2.x](metrics.md))
+ [Patrones de código no compatibles](migration-tool-unsupported-patterns.md): ejemplos detallados de patrones de código comunes que requieren migración manual

# Patrones de código no compatibles de la herramienta de migración
<a name="migration-tool-unsupported-patterns"></a>

La herramienta de migración convierte automáticamente la mayor parte del código de la v1 a la v2. Sin embargo, algunos patrones de código requieren migración manual. En este tema se proporcionan ejemplos detallados de los patrones no compatibles más comunes y se muestra cómo convertirlos manualmente.

Lo que sigue no es una lista de patrones exhaustiva. Si el código no se compila después de ejecutar la herramienta de migración, sigue las [instrucciones de step-by-step migración](migration-steps.md) para migrar manualmente el resto del código de la versión 1.

## Solicitud de constructores de objetos con parámetros
<a name="request-pojo-constructors"></a>

A petición POJOs (excepto Amazon S3), la herramienta de migración solo transforma los métodos setter. La herramienta no admite constructores con parámetros.

**Patrón compatible: solicite un objeto mediante setters (sin parámetros de constructor)**

Antes (código de v1 original):

```
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");
```

Después (resultado de la herramienta de migración):

```
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();
```

**Patrón no compatible: solicite un constructor de objetos con parámetros**

La herramienta de migración no puede convertir constructores con parámetros:

Antes de la migración manual, pero después de la herramienta de migración:

```
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");
```

La herramienta de migración transforma la importación a la v2, pero el código del constructor permanece sin cambios y requiere actualizaciones manuales para utilizar el patrón del compilador.

Después de la migración 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 del cliente de servicio con parámetros individuales
<a name="service-client-method-overloads"></a>

La herramienta de migración no puede convertir los métodos del cliente de servicio que utilizan parámetros individuales en lugar de objetos de solicitud (excepto Amazon S3).

Antes (código de 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");
```

Después (resultado de la herramienta de migración, no se 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");
```

Debe actualizar manualmente los argumentos del método para usar un objeto de solicitud:

```
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 tiempo de espera de solicitud
<a name="request-pojo-timeout-configuration"></a>

La herramienta de migración no convierte los métodos que establecen tiempos de espera en objetos de solicitud.

Antes (código de v1):

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

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

Después (resultado de la herramienta de migración, no se compila):

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

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

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

Debe migrar manualmente para usar el método `overrideConfiguration` de la 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();
```

## Constructores de clientes de servicio con parámetros
<a name="service-client-constructors-with-args"></a>

La herramienta de migración convierte los constructores de clientes de servicio vacíos, pero no puede convertir los constructores que aceptan parámetros como credenciales o configuración.

Antes (código de 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);
```

Después (resultado de la herramienta de migración, no se 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);
```

Debe actualizar manualmente el constructor de clientes de servicio para utilizar el patrón del 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-stepInstrucciones de migración con ejemplo
<a name="migration-steps"></a>

En esta sección se proporciona una step-by-step guía para migrar la aplicación que actualmente usa el SDK para Java v1.x al SDK para Java 2.x. La primera parte presenta una descripción general de los pasos, seguida de un ejemplo detallado de migración.

Los pasos que se describen aquí describen la migración de un caso de uso normal, en el que la aplicación llama Servicios de AWS mediante clientes de servicio basados en modelos. Si necesita migrar un código que utilice un nivel superior APIs , como [S3 Transfer Manager](migration-s3-transfer-manager.md) o la [CloudFrontpresignación](migration-cloudfront-presigning.md), consulte la sección situada debajo del [Qué diferencia hay entre la AWS SDK para Java 1.x y la 2.x](migration-whats-different.md) índice.



El método que se describe aquí es una sugerencia. Puede utilizar otras técnicas y aprovechar las características de edición de código de su IDE para obtener el mismo resultado. 

## Información general sobre los pasos
<a name="migration-steps-overview"></a>

### 1. Inicio agregando la BOM del SDK para Java 2.x
<a name="migration-steps-overview-step1"></a>

Al añadir el elemento BOM (lista de materiales) de Maven para el SDK para Java 2.x a su archivo POM, se asegura de que todas las dependencias de la v2 que necesita son de la misma versión. Su POM puede contener dependencias de v1 y v2. Esto le permite migrar el código de forma incremental en lugar de cambiarlo todo de una vez.

#### BOM del 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>
```

Encontrará la [versión más reciente](https://central.sonatype.com/artifact/software.amazon.awssdk/bom) en el Repositorio central de Maven.

### 2. Búsqueda de archivos para instrucciones de importación de la clase v1
<a name="migration-steps-overview-step2"></a>

Si escaneas los archivos de tu aplicación en busca del SERVICE\$1 IDs utilizado en las importaciones de la versión 1, encontrarás el único IDs SERVICE\$1 utilizado. Un SERVICE\$1ID es un nombre corto y único para un. Servicio de AWS Por ejemplo, `cognitoidentity` es el SERVICE\$1ID de Amazon Cognito Identity.

### 3. Determinación de las dependencias de Maven de la v2 a partir de las instrucciones de importación de la v1
<a name="migration-steps-overview-step3"></a>

Después de encontrar todos los SERVICE\$1 v1 únicosIDs, puedes determinar el artefacto de Maven correspondiente a la dependencia v2 consultando. [Asignaciones de nombre del paquete a artifactId de Maven](#migration-serviceid-artifactid-mapping)

### 4. Adición de elementos de dependencia de la v2 al archivo POM
<a name="migration-steps-overview-step4"></a>

Actualice el archivo POM de Maven con los elementos de dependencia determinados en el paso 3.

### 5. En los archivos Java, cambio gradual de las clases de la v1 a las clases de la v2
<a name="migration-steps-overview-step5"></a>

A medida que sustituya las clases de la v1 por las de la v2, realice los cambios necesarios para que sean compatibles con la API de v2, como utilizar compiladores en lugar de constructores y utilizar fluent getters y setters.

### 6. Eliminación las dependencias de Maven de v1 desde el POM y las importaciones de v1 desde los archivos
<a name="migration-steps-overview-step6"></a>

Después de migrar el código para usar clases de la v2, elimine las importaciones sobrantes de la v1 de los archivos y todas las dependencias del archivo de compilación.

### 7. Refactorización del código para usar mejoras de la API de la v2
<a name="migration-steps-overview-step7"></a>

Una vez que el código se haya compilado correctamente y superado las pruebas, puede aprovechar las mejoras de la v2, como utilizar un cliente de HTTP diferente o paginadores para simplificar el código. Se trata de un paso opcional.

## Ejemplo de migración
<a name="migration-steps-example"></a>

En este ejemplo, migramos una aplicación que usa el SDK para Java v1 y accede a varios Servicios de AWS. En el paso 5 analizaremos en detalle el siguiente método de la v1. Es un método de una clase que contiene ocho métodos y hay 32 clases en la aplicación.

### Método de la v1 para migrar
<a name="v1-snippet-collapsed"></a>

Solo se enumeran las importaciones del SDK de la v1 a continuación del archivo 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. Adición de BOM de Maven de la v2
<a name="migration-steps-example-step1"></a>

Agregue la BOM de Maven para el SDK para Java 2.x al POM junto con cualquier otra dependencia en la sección `dependencyManagement`. Si el archivo POM tiene la BOM de la v1 del SDK, déjela por ahora. Se eliminará en un paso posterior.

#### Administración de dependencias de POM al principio
<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. Búsqueda de archivos para instrucciones de importación de la clase v1
<a name="migration-steps-example-step2"></a>

Busque en el código de la aplicación apariciones únicas de `import com.amazonaws.services`. Esto nos ayuda a determinar las dependencias de la v1 que utiliza el proyecto. Si su aplicación tiene un archivo POM de Maven en la que figuran dependencias de la v1, puede utilizar esta información en su lugar. 

En este ejemplo, utilizamos el comando [`ripgrep` (rg)](https://github.com/BurntSushi/ripgrep) para buscar en la base de código.

Desde la raíz de la base de código, ejecute el comando `ripgrep` siguiente. Una vez `ripgrep` que encuentra las sentencias de importación, se canalizan a los `uniq` comandos `cut``sort`, y para aislar el SERVICE\$1. IDs 

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

Para esta aplicación, se IDs registran los siguientes SERVICE\$1 en la consola.

```
autoscaling
cloudformation
ec2
identitymanagement
```

Esto indica que se ha utilizado al menos una vez cada uno de los siguientes nombres de paquetes en las instrucciones de `import`. Para nuestros propósitos, los nombres de las clases individuales no tienen importancia. Solo necesitamos encontrar los SERVICE\$1 IDs que se utilizan.

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

### 3. Determinación de las dependencias de Maven de la v2 a partir de las instrucciones de importación de la v1
<a name="migration-steps-example-step3"></a>

El SERVICE\$1 IDs de la versión 1 que hemos aislado del paso 2 (por ejemplo, `autoscaling` y) se `cloudformation` puede asignar al mismo SERVICE\$1ID de la versión 2 en su mayor parte. Dado que el artifactId de Maven de la v2 coincide con el SERVICE\$1ID en la mayoría de los casos, usted tiene la información que necesita para añadir bloques de dependencias a su archivo POM.

En la siguiente tabla se muestra cómo podemos determinar las dependencias de la v2.


| SERVICE\$1ID de v1 se asigna a...nombre del paquete | SERVICE\$1ID de v2 se asigna a...nombre del paquete | Dependencia de Maven de v2 | 
| --- | --- | --- | 
|  **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>  | 
|  **escalado automático** `com.amazonaws.services.autoscaling.*`  |  **escalado 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.*` | iam\$1`software.amazon.awssdk.iam.*` |  <pre><dependency><br />  <groupId>software.amazon.awssdk</groupId><br />  <artifactId>iam</artifactId><br /></dependency></pre>  | 

\$1 La asignación de `identitymanagement` a `iam` es una excepción en la que el SERVICE\$1ID difiere según la versión. Consulte en la [Asignaciones de nombre del paquete a artifactId de Maven](#migration-serviceid-artifactid-mapping) las excepciones si Maven o Gradle no pueden resolver la dependencia de la v2.

### 4. Adición de elementos de dependencia de la v2 al archivo POM
<a name="migration-steps-example-step4"></a>

En el paso 3, hemos determinado los cuatro bloques de dependencia que deben añadirse al archivo POM. No necesitamos añadir una versión porque especificamos la BOM en el paso 1. Una vez agregadas las importaciones, nuestro archivo POM tiene los siguientes elementos de dependencia.

```
    ...
  <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. En los archivos Java, cambio gradual de las clases de la v1 a las clases de la v2
<a name="migration-steps-example-step5"></a>

En el método que estamos migrando, vemos
+ Un cliente de servicio de EC2 de `com.amazonaws.services.ec2.AmazonEC2Client`.
+ Se han utilizado varias clases de modelos de EC2. Por ejemplo, `DescribeInstancesRequest` y `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;
}
...
```

Nuestro objetivo es sustituir todas las importaciones de la v1 por las de la v2. Procedemos clase por clase.

#### a. Reemplace la instrucción de importación o el nombre de clase
<a name="migration-example-step5-substep1"></a>

Vemos que el primer parámetro del método `describeRunningInstances` es una instancia de `AmazonEC2Client` v1. Realice una de las siguientes acciones:
+ Sustituya la importación de `com.amazonaws.services.ec2.AmazonEC2Client` con `software.amazon.awssdk.services.ec2.Ec2Client` y cambie `AmazonEC2Client` a `Ec2Client`.
+ Cambie el tipo de parámetro a `Ec2Client` y deje que el IDE nos pida la importación correcta. Nuestro IDE nos pedirá que importemos la clase v2 porque los nombres de cliente son diferentes: `AmazonEC2Client` y `Ec2Client`. Este método no funciona si el nombre de clase es el mismo en ambas versiones.

#### b. Reemplazo de las clases del modelo de v1 por equivalentes de v2
<a name="migration-example-step5-substep2"></a>

Tras el cambio a `Ec2Client` v2, si utilizamos un IDE, aparecen errores de compilación en la siguiente instrucción.

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

El error de compilación se debe al uso de una instancia de `DescribeInstancesRequest` de la v1 como parámetro del método `Ec2Client` `describeInstances` de la v2. Para corregirlo, aplique las siguientes instrucciones de sustitución o importación.


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

#### c. Cambie los constructores de v1 por constructores de v2.
<a name="migration-example-step5-substep3"></a>

Siguen apareciendo errores de compilación porque [no hay constructores en clases de la v2](migration-whats-different.md#immutable-classes). Para corregirlo, realice el siguiente cambio.


| cambiar | a | 
| --- | --- | 
|  <pre>final DescribeInstancesRequest request = new DescribeInstancesRequest()<br />        .withInstanceIds(instanceIdsCopy);</pre>  |  <pre>final DescribeInstancesRequest request = DescribeInstancesRequest.builder()<br />        .instanceIds(instanceIdsCopy)<br />        .build();</pre>  | 

#### d. Reemplace los objetos de respuesta de `*Result` de v1 con los equivalentes de `*Response` de v2
<a name="migration-example-step5-substep4"></a>

Una diferencia constante entre v1 y v2 es que todos los [objetos de respuesta de v2 terminan en `*Response` en lugar de `*Result`](migration-whats-different.md#model-classname-changes). Reemplace la importación de `DescribeInstancesResult` de v1 por la importación de v2, `DescribeInstancesResponse`.

#### d. Realización de cambios en la API
<a name="migration-example-step5-substep5"></a>

La siguiente instrucción necesita algunos cambios.

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

En la v2, [los métodos setter](migration-whats-different.md#setter-getter-methods) no utilizan `set` o `prefix`. Los métodos Getter con prefijo con `get` también han desaparecido del SDK para Java 2.x

Las clases de modelos, como la instancia de `request`, son inmutables en la v2, por lo que debemos crear una `DescribeInstancesRequest` nueva con un compilador.

En la v2, la instrucción pasa a ser la siguiente.

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

#### d. Repita hasta que el método se compile con clases de la v2
<a name="migration-example-step5-substep6"></a>

Continúe con el resto del código. Sustituya las importaciones de la v1 por las de la v2 y corrija los errores de compilación. Consulte la [Referencia de la API de la v2](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/ec2/package-summary.html) y la [Referencia de diferencias](migration-whats-different.md) si es necesario.

Después de migrar este método individual, tendremos el siguiente código de la 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;
    }
...
```

Dado que estamos migrando un único método en un archivo Java con ocho métodos, tenemos una combinación de importaciones de la v1 y v2 a medida que avanzamos en el archivo. Hemos añadido las seis últimas instrucciones de importación a medida que dábamos los pasos. 

Después de migrar todo el código, no habrá más instrucciones de importación de v1.

### 6. Eliminación las dependencias de Maven de v1 desde el POM y las importaciones de v1 desde los archivos
<a name="migration-steps-example-step6"></a>

Tras migrar todo el código de la v1 del archivo, tenemos las siguientes instrucciones de importación del SDK de la 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;
```

Después de migrar *todos* los archivos de nuestra aplicación, ya no necesitamos las dependencias de la v1 en nuestro archivo POM. Elimine la BOM de la v1 de la sección `dependencyManagement`, si la está utilizando, y todos los bloques de dependencias de la v1.

### 7. Refactorización del código para usar mejoras de la API de la v2
<a name="migration-steps-example-step7"></a>

Para el fragmento de código que hemos estado migrando, podemos usar opcionalmente un paginador de v2 y dejar que el SDK administre las solicitudes de datos adicionales basadas en tokens.

Podemos sustituir toda la cláusula `do` por lo siguiente.

```
                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);
                                    }
                                }));
```

## Asignaciones de nombre del paquete a artifactId de Maven
<a name="migration-serviceid-artifactid-mapping"></a>

Al migrar el proyecto de Maven o Gradle de la v1 del SDK para Java a la v2, debe determinar qué dependencias desea añadir al archivo de compilación. El método descrito en los [step-by-stepInstrucciones de migración con ejemplo](#migration-steps) (paso 3) utiliza los nombres de paquetes de las instrucciones de importación como punto de partida para determinar las dependencias (como artifactId) que se van a añadir al archivo de compilación. 

Puede usar la información de este tema para asignar los nombres de paquetes de la v1 a los artifactId de la v2.

### Convención de nomenclatura común utilizada en nombres de paquetes y artifactId de Maven
<a name="migration-naming-convention"></a>

La siguiente tabla muestra la convención de nomenclatura común que se SDKs utiliza para un SERVICE\$1ID determinado. Un SERVICE\$1ID es un identificador único para un. Servicio de AWS Por ejemplo, el SERVICE\$1ID del servicio de Amazon S3 es `s3` y `cognitoidentity` es el SERVICE\$1ID de Amazon Cognito Identity.


| Nombre del paquete v1 (instrucción de importación) | artifactId v1 | artifactId v2 | nombre del paquete v2 (instrucción de importación) | 
| --- | --- | --- | --- | 
| com.amazonaws.services.SERVICE\$1ID | aws-java-sdk-SERVICE\$1ID | SERVICE\$1ID | software.amazon.awssdk.services.SERVICE\$1ID | 
|   | 
| Ejemplo de Amazon Cognito Identity (SERVICE\$1ID: cognitoidentity) | 
| com.amazonaws.services.cognitoidentity | aws-java-sdk- identidad cognitiva | cognitoidentity | software.amazon.awssdk.services.cognitoidentity | 

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

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

En algunos casos, el SERVICE\$1ID presenta diferencias entre el nombre del paquete y el artifactId del mismo servicio. Por ejemplo, la fila de CloudWatch métricas de la siguiente tabla muestra que `metrics` es el SERVICE\$1ID del nombre del paquete, pero `cloudwatchmetrics` es el SERVICE\$1ID del ArtifactID.

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

No hay diferencias en el SERVICE\$1ID utilizado en los nombres de paquetes y artifactId.

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

En la mayoría de los servicios, el SERVICE\$1ID de la v2 es el mismo que el SERVICE\$1ID de la v1, tanto en los nombres de paquetes como en los artifactId. Un ejemplo de esto es el SERVICE\$1ID `cognitoedentity` que se muestra en la tabla anterior. Sin embargo, algunos SERVICE\$1 IDs difieren entre sí, como se muestra en la siguiente tabla. SDKs

Un **SERVICE\$1ID en negrita** en las columnas de la v1 indica que es diferente del SERVICE\$1ID utilizado en la v2.


| Nombre del servicio | Nombre del paquete v1 | artifactId v1 | artifactId v2 | Nombre del paquete v2 | 
| --- | --- | --- | --- | --- | 
|  |  Todos los nombres de paquetes comienzan por `com.amazonaws.services`, como se muestra en la primera fila.  |  Todos los artifactId aparecen entre etiquetas, como se muestra en la primera fila.  |  Todos los artifactId aparecen entre etiquetas, como se muestra en la primera fila.  |  Todos los nombres de paquetes comienzan por `software.amazon.awssdk`, como se muestra en la primera fila.  | 
|  | 
| API Gateway | com.amazonaws.services.apigateway | <artifactId>aws-java-sdk- puerta de enlace api</artifactId> | <artifactId>apigateway</artifactId> | software.amazon.awssdk.services.apigateway | 
| App Registry | appregistry | appregistry | servicecatalogappregistry | servicecatalogappregistry | 
| Application Discovery | applicationdiscovery | discovery | applicationdiscovery | applicationdiscovery | 
| Augmented AI Runtime | augmentedairuntime | augmentedairuntime | sagemakera2iruntime | sagemakera2iruntime | 
| Certificate Manager | certificatemanager | acm | acm | acm | 
| CloudControl API | cloudcontrolapi | cloudcontrolapi | cloudcontrol | cloudcontrol | 
| CloudSearch | cloudsearchv2 | cloudsearch | cloudsearch | cloudsearch | 
| CloudSearch Dominio | cloudsearchdomain | cloudsearch | 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 Ron | cloudwatchrum | cloudwatchrum | rum | rum | 
| Amazon Cognito Identity Provider | cognitoide | cognitoide | cognitoidentityprovider | cognitoidentityprovider | 
| Connect Campaign | 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 archivos 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 | 
| Administración de identidades | identitymanagement | iam | iam | iam | 
| IoT Data | iotdata | iot | iotdataplane | iotdataplane | 
| Kinesis Analytics | kinesisanalytics | kinesis | kinesisanalytics | kinesisanalytics | 
| Kinesis Firehose | kinesisfirehose | kinesis | firehose | firehose | 
| Kinesis Video Signaling Channels | kinesisvideosignalingchannels | kinesisvideosignalingchannels | kinesisvideosignaling | kinesisvideosignaling | 
| Lex | lexruntime | Álex | lexruntime | lexruntime | 
| Lookout For Vision | lookoutforvision | lookoutforvision | lookoutvision | lookoutvision | 
| Modernización de la unidad central | mainframemodernization | mainframemodernization | m2 | m2 | 
| Marketplace Metering | marketplacemetering | marketplacemeteringservice | marketplacemetering | marketplacemetering | 
| Managed Grafana | managedgrafana | managedgrafana | grafana | grafana | 
| Mechanical Turk | mturk | mechanicalturkrequester | mturk | mturk | 
| Recomendaciones de estrategias de Migration Hub | migrationhubstrategyrecommendations | migrationhubstrategyrecommendations | migrationhubstrategy | migrationhubstrategy | 
| Nimble Studio | nimblestudio | nimblestudio | nimble | nimble | 
| Private 5G | private5g | private5g | redes privadas | redes privadas | 
| Prometheus | prometheus | prometheus | amp | amp | 
| Papelera de reciclaje | recyclebin | recyclebin | rbin | rbin | 
| API de datos de Redshift  | redshiftdataapi | redshiftdataapi | redshiftdata | redshiftdata | 
| Route 53 | route53domains | route53 | route53domains | route53domains | 
| Sage Maker 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 Management | simplesystemsmanagement | ssm | ssm | ssm | 
| Simple Workflow | simpleworkflow | simpleworkflow | swf | swf | 
| Step Functions | stepfunctions | stepfunctions | sfn | sfn | 

# Qué diferencia hay entre la AWS SDK para Java 1.x y la 2.x
<a name="migration-whats-different"></a>

En esta sección se describen los principales cambios que hay que tener en cuenta al convertir una aplicación de la AWS SDK para Java versión 1.x a la versión 2.x.

## Cambio de nombre de paquete
<a name="mig-diff-package-name-change"></a>

Un cambio notable del SDK para Java 1.x al SDK para Java 2.x es el cambio de nombre del paquete. Los nombres de los paquetes comienzan por `software.amazon.awssdk` en el SDK 2.x, mientras que en el SDK 1.x se usa `com.amazonaws`.

Estos mismos nombres diferencian los artefactos de Maven del SDK 1.x del SDK 2.x. Los artefactos de Maven para el SDK 2.x usan el GroupID `software.amazon.awssdk`, mientras que el SDK 1.x usa el GroupID `com.amazonaws`.

Hay ocasiones en las que el código requiere una dependencia `com.amazonaws` para un proyecto que, de otro modo, solo utilizaría artefactos del SDK 2.x. Un ejemplo de ello es cuando trabajas con AWS Lambda del lado del servidor. Esto se mostró anteriormente en la sección [Configurar un proyecto de Apache Maven](setup-project-maven.md#modules-dependencies) en esta guía.

**nota**  
Varios nombres de paquetes en el SDK 1.x contienen `v2`. El uso de `v2` en este caso suele significar que el código del paquete está orientado a funcionar con la versión 2 del servicio.   
Como el nombre completo del paquete comienza por `com.amazonaws`, se trata de componentes del SDK 1.x. Algunos ejemplos de estos nombres de paquetes en el SDK 1.x son:   
`com.amazonaws.services.dynamodbv2`
`com.amazonaws.retry.v2`
`com.amazonaws.services.apigatewayv2`
`com.amazonaws.services.simpleemailv2`

## Adición de la versión 2.x a su proyecto
<a name="adding-v2"></a>

Maven es la forma recomendada de gestionar las dependencias cuando se utiliza la 2.x. AWS SDK para Java Para añadir componentes de la versión 2.x a su proyecto, actualice el archivo `pom.xml` con una dependencia en el 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>
```

También puedes [usar las versiones 1.x y 2.x al migrar tu proyecto a la versión 2.x side-by-side](migration-side-by-side.md).

## Inmutable POJOs
<a name="immutable-classes"></a>

Los objetos de respuesta y solicitud de operación y clientes son ahora inmutables y no se pueden cambiar tras la creación. Para reutilizar una variable de respuesta o solicitud, debe crear un objeto nuevo para asignarlo a la misma.

**Example de actualización de un objeto de solicitud en 1.x**  

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

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

**Example de actualización de un objeto de solicitud en 2.x**  

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

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

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

En la versión AWS SDK para Java 2.x, los nombres de los métodos setter no incluyen el prefijo or. `set` `with` Por ejemplo, `*.withEndpoint()` es ahora `*.endpoint()`.

Los nombres de los métodos getter no añaden el prefijo `get`.

**Example de utilizar métodos setter en 1.x**  

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

**Example de utilizar métodos setter en 2.x**  

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

**Example de utilizar métodos getter en 1.x**  

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

**Example de utilizar métodos getter en 2.x**  

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

## Nombres de clases de modelo
<a name="model-classname-changes"></a>

Los nombres de clases de modelo que representan respuestas de servicio terminan en `Response` en v2, en lugar de `Result` como en v1.

**Example de nombres de clases que representan una respuesta en v1**  

```
CreateApiKeyResult
AllocateAddressResult
```

**Example de nombres de clases que representan una respuesta en v2**  

```
CreateApiKeyResponse
AllocateAddressResponse
```

## Estado migratorio de bibliotecas y utilidades
<a name="migration-libraries-utilities"></a>

### Bibliotecas y utilidades del SDK para Java
<a name="migration-java-sdk-libs-utils"></a>

En la siguiente tabla, se muestra el estado de migración de bibliotecas y utilidades del SDK para Java. 


| Nombre de la versión 1.12.x | Nombre de la versión 2.x | A partir de la versión 2.x | 
| --- | --- | --- | 
| Dinamo DBMapper | [DynamoDbEnhancedClient](dynamodb-enhanced-client.md) | 2.12.0 | 
| Esperadores | [Esperadores](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 metadatos EC2 |  [Cliente de metadatos de EC2](examples-ec2-IMDS.md)  | 2.19,29 | 
| Analizador de URI S3 |  [Analizador de URI S3](https://aws.amazon.com/blogs/devops/s3-uri-parsing-is-now-available-in-aws-sdk-for-java-2-x/)  | 2.20,41 | 
| Creador de políticas de IAM | [Creador de políticas de IAM](feature-iam-policy-builder.md) | 2.20.126 | 
| Notificaciones de eventos de S3 | [Notificaciones de eventos de S3](examples-s3-event-notifications.md#s3-event-notification-read) | 2.25.11  | 
| Almacenamiento en búfer del cliente Amazon SQS | [API de procesamiento automático de solicitudes por lotes para Amazon SQS](sqs-auto-batch.md) | 2.28.0 | 
| Agentes de escucha de progreso | Agentes de escucha de progreso | [no publicado aún](https://github.com/aws/aws-sdk-java-v2/issues/25) | 

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

En la tabla siguiente se enumeran las bibliotecas que se publican por separado pero que funcionan con el SDK para Java 2.x.


| Nombre utilizado en la versión 2.x del SDK para Java | Desde la versión | 
| --- | --- | 
|  [Cliente de cifrado de 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 cifrado de bases de datos para DynamoDB](https://docs.aws.amazon.com/database-encryption-sdk/latest/devguide/ddb-java.html) | 3.0.0 2 | 

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

El cliente de cifrado de Amazon S3 está disponible mediante la siguiente dependencia de Maven.

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

#### 2 SDK AWS de cifrado de bases de datos para DynamoDB
<a name="migration-ddb-encryption-sdk"></a>

El SDK AWS de cifrado de bases de datos para DynamoDB está disponible para la versión 2 mediante la siguiente dependencia de Maven.

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

La información sobre la biblioteca de cifrado de DynamoDB que funciona con la versión 1 del SDK de Java está disponible en la Guía para [desarrolladores AWS del SDK de cifrado de bases de datos (denominada](https://docs.aws.amazon.com/database-encryption-sdk/latest/devguide/java.html) Amazon *DynamoDB Encryption Client* for Java) y en. [GitHub](https://github.com/aws/aws-dynamodb-encryption-java)

[Para obtener más información sobre la biblioteca de cifrado de DynamoDB que es compatible con la versión 2 del SDK de Java, consulte la Guía para [desarrolladores del SDK de cifrado de bases de datos y AWS la](https://docs.aws.amazon.com/database-encryption-sdk/latest/devguide/ddb-java.html) fuente. GitHub](https://github.com/aws/aws-database-encryption-sdk-dynamodb)

La información de migración sobre la biblioteca de cifrado está disponible en la [Guía para desarrolladores del SDK de cifrado de bases de datos de AWS](https://docs.aws.amazon.com/database-encryption-sdk/latest/devguide/ddb-java-migrate.html).

### Detalles de migración para bibliotecas y utilidades
<a name="migrate-libs-utils-details"></a>
+ [Gestor de transferencias](migration-s3-transfer-manager.md)
+ [Utilidad de metadatos EC2](migration-imds.md)
+ [CloudFrontprefirmando](migration-cloudfront-presigning.md)
+ [Análisis de URI de S3](migration-s3-uri-parser.md)
+ [DynamoDB mapping/document APIs](migration-ddb-mapper.md) 
+ [Creador de políticas de IAM](migration-iam-policy-builder.md)
+ [Notificaciones de eventos de S3](migration-s3-event-notification.md)
+ Publicación de métricas de SDK ([documentación de 1.x](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/generating-sdk-metrics.html), [documentación de 2.x](metrics.md))

# Cambios de cliente
<a name="migration-clients"></a>

## Compiladores de clientes
<a name="client-builder"></a>

Debe crear todos los clientes mediante el método del compilador de clientes. Los constructores ya no están disponibles.

**Example de creación de un cliente en la versión 1.x**  

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

**Example de creación de un cliente en la versión 2.x**  

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

## Nombres de clase de cliente
<a name="class-names"></a>

Ahora todos los nombres de las clases de los clientes se escriben con mayúsculas y minúsculas y ya no llevan el prefijo `Amazon`. Estos cambios concuerdan con los nombres utilizados en la AWS CLI.

**Example de nombres de clase en 1.x**  

```
AmazonDynamoDB
AWSACMPCAAsyncClient
```

**Example de nombres de clase en 2.x**  

```
DynamoDbClient
AcmAsyncClient
```


**Cambios en el nombre de clases 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 | No es compatible  | 
| 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 | 

# Valores predeterminados de creación de clientes
<a name="client-creation-defaults"></a>

En la versión 2.x, se han realizado los siguientes cambios en la lógica predeterminada de creación de clientes.
+ La cadena predeterminada de proveedor de credenciales para S3 ya no incluye credenciales anónimas. Debe especificar manualmente el acceso anónimo a S3 con `AnonymousCredentialsProvider`.
+ Las siguientes variables de entorno relacionadas con la creación de clientes predeterminada son diferentes.    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/sdk-for-java/latest/developer-guide/client-creation-defaults.html)
+ Las siguientes propiedades del sistema relacionadas con la creación predeterminada de cliente son difererentes.     
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/sdk-for-java/latest/developer-guide/client-creation-defaults.html)
+ La versión 2.x no admite las siguientes propiedades del sistema.
+     
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/sdk-for-java/latest/developer-guide/client-creation-defaults.html)
+ Ya no se admite la carga de la configuración de la región desde un archivo `endpoints.json` personalizado.

# Configuración de cliente
<a name="client-configuration"></a>

En la versión 1.x, la configuración del cliente del SDK se modificaba estableciendo una instancia `ClientConfiguration` en el cliente o en el compilador de clientes. En la versión 2.x, la configuración del cliente se divide en clases de configuración independientes. Con las clases de configuración separadas, puede configurar diferentes clientes HTTP para clientes asíncronos frente a síncronos, pero seguir utilizando la misma clase `ClientOverrideConfiguration`.

**Example de configuración del cliente en la versión 1.x**  

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

**Example de configuración de clientes síncronos en la versión 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 de configuración de clientes asíncronos en la versión 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 de HTTP
<a name="client-configuration-http"></a>

### Cambios destacados
<a name="client-configuration-http-notables"></a>
+ En la versión 2.x, puede cambiar qué cliente de HTTP desea usar en tiempo de ejecución especificando una implementación mediante `clientBuilder.httpClientBuilder`.
+ Al pasar un cliente de HTTP mediante `clientBuilder.httpClient` a un compilador de clientes de servicio, el cliente de HTTP no se cierra de forma predeterminada si el cliente de servicio se cierra. Esto le permite compartir clientes de HTTP entre clientes de servicio.
+ Los clientes de HTTP asincrónicos ahora usan una E/S no bloqueante.
+ Algunas operaciones utilizan ahora HTTP/2 para mejorar el rendimiento.

### Cambios de configuración
<a name="client-configuration-http-setting-diffs"></a>


| Opción | 1.x | 2.x Sync, Apache | 2.x Async, 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 conexiones |  <pre>clientConfig.setMaxConnections(...)<br />clientConfig.withMaxConnections(...)</pre>  |  <pre>httpClientBuilder.maxConnections(...)</pre>  |  <pre>httpClientBuilder.maxConcurrency(...)</pre>  | 
| Tiempo de espera de la conexión |  <pre>clientConfig.setConnectionTimeout(...)<br />clientConfig.withConnectionTimeout(...)</pre>  |  <pre>httpClientBuilder.connectionTimeout(...)<br />httpClientBuilder.connectionAcquisitionTimeout(...)</pre>  |  <pre>httpClientBuilder.connectionTimeout(...)</pre>  | 
| Tiempo de espera de sockets |  <pre>clientConfig.setSocketTimeout(...)<br />clientConfig.withSocketTimeout(...)</pre>  |  <pre>httpClientBuilder.socketTimeout(...)</pre>  |  <pre>httpClientBuilder.writeTimeout(...)<br />httpClientBuilder.readTimeout(...)</pre>  | 
| TTL de conexión |  <pre>clientConfig.setConnectionTTL(...)<br />clientConfig.withConnectionTTL(...)</pre>  |  <pre>httpClientBuilder.connectionTimeToLive(...)</pre>  |  <pre>httpClientBuilder.connectionTimeToLive(...)</pre>  | 
| Inactividad máx. de conexión |  <pre>clientConfig.setConnectionMaxIdleMillis(...)<br />clientConfig.withConnectionMaxIdleMillis(...)</pre>  |  <pre>httpClientBuilder.connectionMaxIdleTime(...)</pre>  |  <pre>httpClientBuilder.connectionMaxIdleTime(...)</pre>  | 
| Validación después de inactividad |  <pre>clientConfig.setValidateAfterInactivityMillis(...)<br />clientConfig.withValidateAfterInactivityMillis(...)</pre>  | No se admite ([característica de solicitud](https://github.com/aws/aws-sdk-java-v2/issues/new)) | No se admite ([característica de solicitud](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
| Dirección local |  <pre>clientConfig.setLocalAddress(...)<br />clientConfig.withLocalAddress(...)</pre>  |  <pre>httpClientBuilder.localAddress(...)</pre>  | [No compatible](https://github.com/aws/aws-sdk-java-v2/issues/857) | 
| Expect-continue habilitada |  <pre>clientConfig.setUseExpectContinue(...)<br />clientConfig.withUseExpectContinue(...)</pre>  |  <pre>httpClientBuilder.expectContinueEnabled(...)</pre>  | No se admite ([característica de solicitud](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
| Connection reaper |  <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 de HTTP
<a name="client-configuration-http-proxy"></a>


| Configuración | 1.x | 2.x Sync, Apache | 2.x Async, 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 del proxy. |  <pre>clientConfig.setProxyHost(...)<br />clientConfig.withProxyHost(...)</pre>  |  <pre>proxyConfig.endpoint(...)</pre>  |  <pre>proxyConfig.host(...)</pre>  | 
| Puerto del proxy. |  <pre>clientConfig.setProxyPort(...)<br />clientConfig.withProxyPort(...)</pre>  |  <pre>proxyConfig.endpoint(...)</pre> El [puerto proxy](http-configuration-apache.md#http-configuration-apache-proxy-conf-ex) está incrustado en `endpoint`  |  <pre>proxyConfig.port(...)</pre>  | 
| Nombre de usuario del proxy |  <pre>clientConfig.setProxyUsername(...)<br />clientConfig.withProxyUsername(...)</pre>  |  <pre>proxyConfig.username(...)</pre>  |  <pre>proxyConfig.username(...)</pre>  | 
| Contraseña del proxy. |  <pre>clientConfig.setProxyPassword(...)<br />clientConfig.withProxyPassword(...)</pre>  |  <pre>proxyConfig.password(...)</pre>  |  <pre>proxyConfig.password(...)</pre>  | 
| Dominio de proxy |  <pre>clientConfig.setProxyDomain(...)<br />clientConfig.withProxyDomain(...)</pre>  |  <pre>proxyConfig.ntlmDomain(...)</pre>  | No se admite ([característica de solicitud](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
| Estación de trabajo proxy |  <pre>clientConfig.setProxyWorkspace(...)<br />clientConfig.withProxyWorkstation(...)</pre>  |  <pre>proxyConfig.ntlmWorkstation(...)</pre>  | No se admite ([característica de solicitud](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
| Métodos de autenticación de proxy |  <pre>clientConfig.setProxyAuthenticationMethods(...)<br />clientConfig.withProxyAuthenticationMethods(...)</pre>  |  [No se admite](https://github.com/aws/aws-sdk-java-v2/issues/858)  | No se admite ([característica de solicitud](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
| Autenticación proxy básica prioritaria |  <pre>clientConfig.setPreemptiveBasicProxyAuth(...)<br />clientConfig.withPreemptiveBasicProxyAuth(...)</pre>  |  <pre>proxyConfig.preemptiveBasicAuthenticationEnabled(...)</pre>  | No se admite ([característica de solicitud](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
| Host sin proxy |  <pre>clientConfig.setNonProxyHosts(...)<br />clientConfig.withNonProxyHosts(...)</pre>  |  <pre>proxyConfig.nonProxyHosts(...)</pre>  |  <pre>proxyConfig.nonProxyHosts(...)</pre>  | 
| Deshabilitación del proxy de sockets |  <pre>clientConfig.setDisableSocketProxy(...)<br />clientConfig.withDisableSocketProxy(...)</pre>  | No se admite ([característica de solicitud](https://github.com/aws/aws-sdk-java-v2/issues/new)) | No se admite ([característica de solicitud](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>  | 

## Anulaciones de clientes
<a name="client-override-config-diffs"></a>


| Opción | 1.x | 2.x | 
| --- | --- | --- | 
|  |  <pre>ClientConfiguration clientConfig =<br />    new ClientConfiguration()</pre>  |  <pre>ClientOverrideConfiguration.Builder overrideConfig =<br />    ClientOverrideConfiguration.builder()</pre>  | 
| Prefijo de agente de usuario |  <pre>clientConfig.setUserAgentPrefix(...)<br />clientConfig.withUserAgentPrefix(...)</pre>  |  <pre>overrideConfig.advancedOption(<br />    SdkAdvancedClientOption.USER_AGENT_PREFIX, ...)</pre>  | 
| Sufijo de agente de usuario |  <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>  | 
| Encabezados adicionales |  <pre>clientConfig.addHeader(...)<br />clientConfig.withHeader(...)</pre>  |  <pre>overrideConfig.putHeader(...)</pre>  | 
| Solicita tiempo de espera |  <pre>clientConfig.setRequestTimeout(...)<br />clientConfig.withRequestTimeout(...)</pre>  |  <pre>overrideConfig.apiCallAttemptTimeout(...)</pre>  | 
| Tiempo de espera de ejecución de clientes |  <pre>clientConfig.setClientExecutionTimeout(...)<br />clientConfig.withClientExecutionTimeout(...)</pre>  |  <pre>overrideConfig.apiCallTimeout(...)</pre>  | 
| Uso de Gzip |  <pre>clientConfig.setUseGzip(...)<br />clientConfig.withGzip(...)</pre>  |  No se admite ([característica de solicitud](https://github.com/aws/aws-sdk-java-v2/issues/new))  | 
| Sugerencia del tamaño del búfer de socket |  <pre>clientConfig.setSocketBufferSizeHints(...)<br />clientConfig.withSocketBufferSizeHints(...)</pre>  | No se admite ([característica de solicitud](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
| Metadatos de respuesta en caché |  <pre>clientConfig.setCacheResponseMetadata(...)<br />clientConfig.withCacheResponseMetadata(...)</pre>  | No se admite ([característica de solicitud](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
| Tamaño de caché de metadatos de respuesta |  <pre>clientConfig.setResponseMetadataCacheSize(...)<br />clientConfig.withResponseMetadataCacheSize(...)</pre>  | No se admite ([característica de solicitud](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
| servicio de resolución de nombres DNS |  <pre>clientConfig.setDnsResolver(...)<br />clientConfig.withDnsResolver(...)</pre>  | No se admite ([característica de solicitud](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
| keepalive de TCP |  <pre>clientConfig.setUseTcpKeepAlive(...)<br />clientConfig.withTcpKeepAlive(...)</pre>  |  Esta opción se encuentra ahora en la configuración del cliente de HTTP <pre>- ApacheHttpClient.builder().tcpKeepAlive(true)<br />- NettyNioAsyncHttpClient.builder().tcpKeepAlive(true)</pre>  | 
| Protección aleatoria |  <pre>clientConfig.setSecureRandom(...)<br />clientConfig.withSecureRandom(...)</pre>  | No se admite ([característica de solicitud](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>  | 

## El cliente anula los reintentos
<a name="client-override-retry-config-diffs"></a>


| Opción | 1.x | 2.x | 
| --- | --- | --- | 
|  |  <pre>ClientConfiguration clientConfig =<br />    new ClientConfiguration()</pre>  |  <pre>ClientOverrideConfiguration.Builder overrideConfigBuilder = <br />    ClientOverrideConfiguration.builder();</pre>  | 
| Error máx. de reintento |  <pre>clientConfig.setMaxErrorRetry(...)<br />clientConfig.withMaxErrorRetry(...)</pre>  |  <pre>// Configure the default retry strategy.<br />overrideConfigBuilder.retryStrategy(b -> b.maxAttempts(...));</pre>  | 
| Uso de reintentos limitados |  <pre>clientConfig.setUseThrottleRetries(...)<br />clientConfig.withUseThrottleRetries(...)</pre>  | [No compatible](https://github.com/aws/aws-sdk-java-v2/issues/645) | 
| Máx. de reintentos consecutivos antes de limitación |  <pre>clientConfig.setMaxConsecutiveRetriesBeforeThrottling(...)<br />clientConfig.withMaxConsecutiveRetriesBeforeThrottling(...)</pre>  | [No compatible](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 asíncronos
<a name="client-async-config-diffs"></a>


| Opción | 1.x | 2.x | 
| --- | --- | --- | 
|  |  |  <pre>ClientAsyncConfiguration.Builder asyncConfig =<br />    ClientAsyncConfiguration.builder()</pre>  | 
| Ejecutor |  <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>  | 

## Otros cambios de cliente
<a name="client-config-other-diffs"></a>

La siguiente opción `ClientConfiguration` de la versión 1.x ha cambiado en 2.x del SDK y no tiene un equivalente directo.


| Opción | 1.x | Equivalente en 2.x | 
| --- | --- | --- | 
| Protocolo |  <pre>clientConfig.setProtocol(Protocol.HTTP)<br />clientConfig.withProtocol(Protocol.HTTP)</pre>  |  El ajuste del protocolo es HTTPS de forma predeterminada. Para modificar el ajuste, especifique el protocolo estableciendo un punto de conexión HTTP en el compilador de clientes: <pre>clientBuilder.endpointOverride(<br />    URI.create("http://..."))</pre>  | 

# Cambios en el proveedor de credenciales
<a name="migration-client-credentials"></a>

En esta sección se ofrece un esquema de los cambios de nombre de las clases y los métodos de proveedor de credenciales entre las versiones 1.x y 2.x del AWS SDK para Java. 

## Diferencias destacadas
<a name="client-credentials"></a>
+ En la versión 2.x, el proveedor de credenciales predeterminado carga las propiedades del sistema antes que las variables de entorno. Para obtener más información, consulte [Uso de credenciales](credentials.md).
+ El método constructor se sustituye por los métodos `create` o `builder`.  
**Example**  

  ```
  DefaultCredentialsProvider.create();
  ```
+ La actualización asíncrona ya no está configurada de forma predeterminada. Debe especificarla con el `builder` del proveedor de credenciales.  
**Example**  

  ```
  ContainerCredentialsProvider provider = ContainerCredentialsProvider.builder()
          		.asyncCredentialUpdateEnabled(true)
          		.build();
  ```
+ Puede especificar una ruta a un archivo de perfil personalizado utilizando `ProfileCredentialsProvider.builder()`.  
**Example**  

  ```
  ProfileCredentialsProvider profile = ProfileCredentialsProvider.builder()
          		.profileFile(ProfileFile.builder().content(Paths.get("myProfileFile.file")).build())
          		.build();
  ```
+ El formato del archivo de perfil ha cambiado para que coincida mejor con la AWS CLI. Para obtener más información, consulte [Configurar la AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html) en la *Guía del usuario de AWS Command Line Interface*.

## Cambios del proveedor de credenciales entre las versiones 1.x y 2.x
<a name="credentials-changes-mapping"></a>

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


| Categoría del cambio | 1.x | 2.x | 
| --- | --- | --- | 
| Nombre del paquete/clase | com.amazonaws.auth.AWSCredentialsProvider | software.amazon.awssdk.auth.credentials.AwsCredentialsProvider | 
| Nombre del método | getCredentials | resolveCredentials | 
| Método no admitido | refresh | No admitido | 

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


| Categoría del cambio | 1.x | 2.x | 
| --- | --- | --- | 
| Nombre del paquete/clase | com.amazonaws.auth.DefaultAWSCredentialsProviderChain | software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider | 
| Creación | new DefaultAWSCredentialsProviderChain | DefaultCredentialsProvider.create | 
| Método no admitido | getInstance | No admitido | 
| Orden de prioridad de ajustes externos |  Variables de entorno antes que propiedades del sistema  |  Propiedades del sistema antes que variables de entorno  | 

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


| Categoría del cambio | 1.x | 2.x | 
| --- | --- | --- | 
| Nombre del paquete/clase | com.amazonaws.auth.AWSStaticCredentialsProvider | software.amazon.awssdk.auth.credentials.StaticCredentialsProvider | 
| Creación | new AWSStaticCredentialsProvider | StaticCredentialsProvider.create | 

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


| Categoría del cambio | 1.x | 2.x | 
| --- | --- | --- | 
| Nombre del paquete/clase | com.amazonaws.auth.EnvironmentVariableCredentialsProvider | software.amazon.awssdk.auth.credentials.EnvironmentVariableCredentialsProvider | 
| Creación | new EnvironmentVariableCredentialsProvider | EnvironmentVariableCredentialsProvider.create | 
| Nombre de la variable de entorno | AWS\$1ACCESS\$1KEY | AWS\$1ACCESS\$1KEY\$1ID | 
|  | AWS\$1SECRET\$1KEY | AWS\$1SECRET\$1ACCESS\$1KEY | 

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


| Categoría del cambio | 1.x | 2.x | 
| --- | --- | --- | 
| Nombre del paquete/clase | com.amazonaws.auth.SystemPropertiesCredentialsProvider | software.amazon.awssdk.auth.credentials.SystemPropertyCredentialsProvider | 
| Creación | new SystemPropertiesCredentialsProvider | SystemPropertiesCredentialsProvider.create | 
| Nombre de la propiedad del sistema | aws.secretKey | aws.secretAccessKey | 

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


| Categoría del cambio | 1.x | 2.x | 
| --- | --- | --- | 
| Nombre del paquete/clase | com.amazonaws.auth.profile.ProfileCredentialsProvider | software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider | 
| Creación | new ProfileCredentialsProvider | ProfileCredentialsProvider.create | 
| Ubicación del perfil personalizado |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/sdk-for-java/latest/developer-guide/migration-client-credentials.html)  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/sdk-for-java/latest/developer-guide/migration-client-credentials.html)  | 

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


| Categoría del cambio | 1.x | 2.x | 
| --- | --- | --- | 
| Nombre del paquete/clase | com.amazonaws.auth.ContainerCredentialsProvider | software.amazon.awssdk.auth.credentials.ContainerCredentialsProvider | 
| Creación | new ContainerCredentialsProvider | ContainerCredentialsProvider.create | 
| Especificación de actualización asincrónica | No admitido | Comportamiento predeterminado | 

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


| Categoría del cambio | 1.x | 2.x | 
| --- | --- | --- | 
| Nombre del paquete/clase | com.amazonaws.auth.InstanceProfileCredentialsProvider | software.amazon.awssdk.auth.credentials.InstanceProfileCredentialsProvider | 
| Creación | new InstanceProfileCredentialsProvider | InstanceProfileCredentialsProvider.create | 
| Especificación de actualización asincrónica | new InstanceProfileCredentialsProvider(true) |  `InstanceProfileCredentialProvider.builder().asyncCredentialUpdateEnabled(true).build()`  | 
| Nombre de la propiedad del sistema | com.amazonaws.sdk.disableEc2Metadata | aws.disableEc2Metadata | 
|  | com.amazonaws.sdk.ec2MetadataServiceEndpointOverride | aws.ec2MetadataServiceEndpoint | 

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


| Categoría del cambio | 1.x | 2.x | 
| --- | --- | --- | 
| Nombre del paquete/clase | com.amazonaws.auth.STSAssumeRoleSessionCredentialsProvider | software.amazon.awssdk.services.sts.auth.StsAssumeRoleCredentialsProvider | 
| Creación |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/sdk-for-java/latest/developer-guide/migration-client-credentials.html)  | StsAssumeRoleCredentialsProvider.builder | 
| Actualización asincrónica | Comportamiento predeterminado | Comportamiento predeterminado | 
| Configuración | new STSAssumeRoleSessionCredentialsProvider.Builder | Configuración de una solicitud StsClient y AssumeRoleRequest | 

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


| Categoría del cambio | 1.x | 2.x | 
| --- | --- | --- | 
| Nombre del paquete/clase | com.amazonaws.auth.STSSessionCredentialsProvider | software.amazon.awssdk.services.sts.auth.StsGetSessionTokenCredentialsProvider | 
| Creación |  `new STSSessionCredentialsProvider`  | StsGetSessionTokenCredentialsProvider.builder | 
| Actualización asincrónica | Comportamiento predeterminado | StsGetSessionTokenCredentialsProvider.builder | 
| Configuración | Parámetros del constructor | Configuración de una solicitud StsClient y GetSessionTokenRequest en un compilador | 

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


| Categoría del cambio | 1.x | 2.x | 
| --- | --- | --- | 
| Nombre del paquete/clase | com.amazonaws.auth.WebIdentityFederationSessionCredentialsProvider | software.amazon.awssdk.services.sts.auth.StsAssumeRoleWithWebIdentityCredentialsProvider | 
| Creación |  `new WebIdentityFederationSessionCredentialsProvider`  | StsAssumeRoleWithWebIdentityCredentialsProvider.builder | 
| Actualización asincrónica | Comportamiento predeterminado | StsAssumeRoleWithWebIdentityCredentialsProvider.builder | 
| Configuración | Parámetros del constructor | Configuración de una solicitud StsClient y AssumeRoleWithWebIdentityRequest en un compilador | 

### Clases reemplazadas
<a name="credentials-provider-changes-Replacements"></a>


| Clase 1.x | Clases de reemplazo 2.x | 
| --- | --- | 
| com.amazonaws.auth.EC2ContainerCredentialsProviderWrapper | software.amazon.awssdk.auth.credentials.ContainerCredentialsProvider y software.amazon.awssdk.auth.credentials.InstanceProfileCredentialsProvider | 
| com.amazonaws.services.s3.S3CredentialsProviderChain | software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider y software.amazon.awssdk.auth.credentials.AnonymousCredentialsProvider | 

### Clases eliminadas
<a name="credentials-provider-changes-Removed"></a>


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

# Cambios de región
<a name="migration-client-region"></a>

En esta sección se describen los cambios implementados en el AWS SDK para Java 2.x para usar las clases `Region` y `Regions`.

## Configuración de región
<a name="region-configuration"></a>
+ Algunos servicios de AWS no tienen puntos de conexión específicos de cada región. Al utilizar dichos servicios, debe configurar la región como `Region.AWS_GLOBAL` o `Region.AWS_CN_GLOBAL`.  
**Example**  

  ```
  Region region = Region.AWS_GLOBAL;
  ```
+  Las clases `com.amazonaws.regions.Regions` y `com.amazonaws.regions.Region` se combinan ahora en una clase, `software.amazon.awssdk.regions.Region`.

## Asignaciones de nombres de métodos y clases
<a name="region-method-mapping"></a>

Las tablas siguientes asignan clases relacionadas con la región entre las versiones 1.x y 2.x del AWS SDK para Java. Puede crear una instancia de estas clases utilizando el método `of()`.

**Example**  

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


**Cambios en el método de clases de regiones 1.x**  

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


**Cambios en el método de clases de región 1.x**  

| 1.x | 2.x | 
| --- | --- | 
|  `Region.getName`  |  `Region.id`  | 
|  `Region.hasHttpsEndpoint`  |  No es compatible  | 
|  `Region.hasHttpEndpoint`  |  No es compatible  | 
|  `Region.getAvailableEndpoints`  |  No es compatible  | 
|  `Region.createClient`  |  No es compatible  | 


**Cambios de método de la clase RegionMetadata**  

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


**Cambios de método de la clase ServiceMetadata**  

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

# Cambios en operaciones, solicitudes y respuestas
<a name="migration-operation-requests-responses"></a>

En la versión 2 del SDK para Java, las solicitudes se pasan a una operación de cliente. Por ejemplo, `DynamoDbClient's` `PutItemRequest` se pasa a la operación `DynamoDbClient.putItem`. Estas operaciones devuelven una respuesta de Servicio de AWS, como un`PutItemResponse`.

La versión 2 del SDK para Java presenta los siguientes cambios con respecto a la versión 1.
+ Las operaciones con varias páginas de respuesta ahora tienen un método `Paginator` para iterar automáticamente todos los elementos de la respuesta.
+ No se pueden mutar solicitudes y respuestas.
+ Debe crear solicitudes y respuestas con un método de creador estático en lugar de un constructor. Por ejemplo, `new PutItemRequest().withTableName(...)` de la versión 1 ahora es `PutItemRequest.builder().tableName(...).build()`.
+ Las operaciones admiten una forma abreviada de crear solicitudes: `dynamoDbClient.putItem(request -> request.tableName(...))`.

En las siguientes secciones se describen cambios específicos entre la versión 1 y la 2. Algunos cambios en los tipos de parámetros se pueden convertir automáticamente mediante la [herramienta de migración](migration-tool.md), mientras que otros cambios requieren actualizaciones manuales del código.

# Cambios en el parámetro Fecha
<a name="migration-date-parameters"></a>

En la versión 1, muchas operaciones aceptaban objetos `java.util.Date` como parámetros basados en tiempo. En la versión 2, estas operaciones utilizan objetos `java.time.Instant` en su lugar.

Puede convertir los parámetros `Date` automáticamente mediante la [herramienta de migración](migration-tool.md) o puede convertirlos manualmente llamando al método `toInstant()` del objeto `Date`.

**Example - Genere una URL prefirmada con fecha de caducidad en la versión 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 - Genere una URL prefirmada con un instante de caducidad en la versión 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());
```

# Cambios en el tratamiento de datos binarios
<a name="migration-binary-data"></a>

En la versión 1, los datos binarios se trataban utilizando objetos `ByteBuffer` directamente. En la versión 2, el SDK utiliza objetos `SdkBytes` que proporcionan una forma más cómoda y segura de trabajar con datos binarios.

Puede convertir `SdkBytes` a `ByteBuffer` automáticamente mediante la [herramienta de migración](migration-tool.md) o puede convertirlos manualmente llamando a `asByteBuffer()` en el objeto `SdkBytes` devuelto.

**Example - Obtenga datos binarios de un atributo de mensaje en la versión 1**  

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

**Example - Obtenga datos binarios de un atributo de mensaje en la versión 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());
```

# Cambios en el parámetro Tiempo de espera
<a name="migration-timeout-parameters"></a>

En la versión 1, los valores de tiempo de espera se especificaban como valores enteros que representaban milisegundos. En la versión 2, los parámetros de tiempo de espera utilizan objetos `java.time.Duration` para mejorar la seguridad y claridad de los textos.

Puede convertir los valores de tiempo de espera numéricos automáticamente mediante la [herramienta de migración](migration-tool.md), o puede convertirlos manualmente ajustando los valores numéricos con el método de fábrica de `Duration` adecuado.

**Example - Establezca un tiempo de espera de solicitud en la versión 1**  

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

**Example - Establezca un tiempo de espera de solicitud en la versión 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
```

Puede usar uno de los siguientes métodos de fábrica de `Duration` para los valores de tiempo de espera:
+ `Duration.ofMillis(long millis)`: para valores de milisegundos.
+ `Duration.ofSeconds(long seconds)`: para valores de segundos.
+ `Duration.ofMinutes(long minutes)`: para valores de minutos.

# Diferencias en la operación de streaming entre 1.x y 2.x del AWS SDK para Java
<a name="migration-streaming-ops"></a>

Las operaciones de streaming, como Amazon S3 `getObject` y sus `putObject` métodos, admiten el no bloqueo I/O en la versión 2.x del SDK. Como resultado, los objetos del modelo de solicitud y respuesta ya no toman un `InputStream` como parámetro. En su lugar, para solicitudes sincrónicas, el objeto de solicitud acepta `RequestBody`, que es un flujo de bytes. El equivalente asincrónico acepta un `AsyncRequestBody`.

**Example de la operación `putObject` de Amazon S3 en 1.x**  

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

**Example de la operación `putObject` de Amazon S3 en 2.x**  

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

Un objeto de respuesta de streaming acepta un `ResponseTransformer` para clientes sincrónicos y un `AsyncResponseTransformer` para asincrónicos en V2.

**Example de la operación `getObject` de Amazon S3 en 1.x**  

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

**Example de la operación `getObject` de Amazon S3 en 2.x**  

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

En el SDK para Java 2.x, las operaciones de respuesta de streaming tienen un método `AsBytes` para cargar la respuesta en la memoria y simplificar las conversiones de tipo común en la memoria.

# Diferencias de serialización entre 1.x y 2.x del AWS SDK para Java
<a name="migration-serialization-changes"></a>

## Enumere los objetos para solicitar la diferencia de parámetros
<a name="serialization-diffs-list-obj-to-req-param"></a>

Los SDK para Java v1.x y v2.x difieren en la forma en que serializan los objetos de lista para solicitar parámetros.

El SDK para Java 1.x no serializa una lista vacía, mientras que el SDK para Java 2.x serializa una lista vacía como un parámetro vacío.

Por ejemplo, pensemos en un servicio con un `SampleOperation` que toma un `SampleRequest`. `SampleRequest` acepta dos parámetros: un tipo de cadena `str1` y un tipo de lista `listParam`, como se muestra en los siguientes ejemplos.

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

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

sampleServiceV1Client.sampleOperation(v1Request);
```
El registro a nivel de cable muestra que el parámetro `listParam` no está serializado.  

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

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

```
sampleServiceV2Client.sampleOperation(b -> b
    .str1("TestName"));
```
El registro a nivel de cable muestra que el parámetro `listParam` está serializado con ningún valor.  

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

## POJOs en la V1 en comparación con los constructores de la V2
<a name="serialization-json-objects"></a>

Dado que SDK V1 para Java usa clases POJO mutables, las bibliotecas de serialización y deserialización, como [Jackson](https://github.com/FasterXML/jackson-docs), pueden usar objetos de modelo directamente. 

El SDK V2 para Java, por el contrario, utiliza objetos de modelo inmutables. Debe usar un compilador intermedio para realizar desserialización.

El siguiente ejemplo muestra las diferencias entre de/serializing una llamada a la `headBucket` API con la V1 y la V2 con un 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();
    }
```

# Diferencias de deserialización entre 1.x y 2.x del AWS SDK para Java
<a name="migration-deserialization-changes"></a>

## Colecciones vacías en V2 en comparación con `nulls` en V1
<a name="deserialization-diffs-list-obj-to-req-param"></a>

Los SDK para Java v1.x y v2.x difieren en la forma en que deserializan las respuestas de JSON con listas y mapas vacíos.

Cuando el SDK recibe una respuesta en la que falta una propiedad que está modelada como lista o mapa, la V1 deserializa la propiedad que falta en `null`, mientras que la V2 deserializa la propiedad en un objeto de colección vacío e inmutable.

Por ejemplo, considere la respuesta que devuelve el método `describeTable` desde un cliente de DynamoDB. El siguiente método de ejemplo contiene un cliente de DynamoDB V2 y un cliente de DynamoDB V1 que ejecutan el método `describeTable` en una tabla que no tiene índices secundarios globales.

**Example de la deserialización de una propiedad modelada como lista que falta en la respuesta**  

```
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>");
    }
}
```
A continuación se muestra la salida 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>
```

El SDK 2.x de Java adopta un método idiomático deserializando mapas y listas vacías en colecciones vacías inmutables en lugar de devolver `null`, lo que promueve un código más seguro y conciso. Con la V2 puede comprobar si un servicio ha devuelto un atributo modelado como lista o mapa con el método `has*`, como los `hasGlobalSecondaryIndexes` que se muestran en el ejemplo anterior.

Este método evita la necesidad de realizar comprobaciones de `null` explícitas y se ajusta a las modernas prácticas recomendadas de Java para administrar estructuras de datos ausentes o vacías.

### Ejemplo 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));
    }
}
```

La respuesta de JSON para el método `describeTable` del cliente de la V1 y V2 no contiene ningún 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
    }
  }
}
```

# Cambios de excepción
<a name="migration-exception-changes"></a>

Los nombre de clases de excepción también han cambiado, así como sus estructuras y relaciones. `software.amazon.awssdk.core.exception.SdkException` es la nueva clase de `Exception` base que amplían todas las demás excepciones.

En esta tabla se mapean los cambios de nombres de clase de excepción.


| 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`   | 

En la siguiente tabla se mapean los métodos de las clases de excepción entre la versión 1.x y la 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`   | 

# Cambios específicos de los servicios
<a name="migration-service-changes"></a>

## Cambios en Amazon S3
<a name="s3-operations-name"></a>

SDK para Java 2.x deshabilita el acceso anónimo de forma predeterminada. Por lo tanto, debe habilitar el acceso anónimo mediante el `AnonymousCredentialsProvider`.

### Cambios en nombres de operaciones
<a name="s3-op-name-changes"></a>

Muchos de los nombres de operación para el cliente de Amazon S3 han cambiado en el AWS SDK para Java 2.x. En la versión 1.x, el cliente de Amazon S3 no se generaba directamente desde la API de servicio. Esto se traduce en una incoherencia entre las operaciones de SDK y la API de servicio. En la versión 2.x, ahora generamos el cliente de Amazon S3 para que sea más coherente con la API de servicio.

En la tabla siguiente se muestran los nombres de operaciones en las dos versiones.


**Nombres de operaciones de 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 o getBucketLifecycleConfiguration | 
| getBucketLocation | getBucketLocation | 
| getBucketLoggingConfiguration | getBucketLogging | 
| getBucketMetricsConfiguration | getBucketMetricsConfiguration | 
| getBucketNotificationConfiguration | getBucketNotification o 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 o putBucketLifecycleConfiguration | 
| setBucketLoggingConfiguration | putBucketLogging | 
| setBucketMetricsConfiguration | putBucketMetricsConfiguration | 
| setBucketNotificationConfiguration | putBucketNotification o putBucketNotificationConfiguration | 
| setBucketPolicy | putBucketPolicy | 
| setBucketReplicationConfiguration | putBucketReplication | 
| setBucketTaggingConfiguration | putBucketTagging | 
| setBucketVersioningConfiguration | putBucketVersioning | 
| setBucketWebsiteConfiguration | putBucketWebsite | 
| setObjectAcl | putObjectAcl | 
| setObjectRedirectLocation | copyObject | 
| setObjectTagging | putObjectTagging | 
| uploadPart | uploadPart | 

## Cambios en Amazon SNS
<a name="sns-changes"></a>

Un cliente de SNS ya no puede acceder a temas de SNS en regiones distintas de la región para la que está configurado.

## Cambios en Amazon SQS
<a name="sqs-changes"></a>

Un cliente de SQS ya no puede acceder a colas de SQS en regiones distintas de la región para la que está configurado.

## Cambios en Amazon RDS
<a name="rds-changes"></a>

El SDK para Java 2.x utiliza `RdsUtilities#generateAuthenticationToken` en lugar de la clase `RdsIamAuthTokenGenerator` de 1.x.

# Cambios en el trabajo con Amazon S3 de la versión 1 a la versión 2 del AWS SDK para Java
<a name="migration-s3"></a>

 AWS SDK for Java 2.x Introduce cambios importantes en el cliente S3, que incluyen una nueva estructura de paquetes, nombres de clases actualizados y firmas de métodos revisadas. Si bien muchos métodos se pueden migrar automáticamente de la V1 a la V2 mediante la [herramienta de migración](migration-tool.md), algunos requieren migración manual, como `listNextBatchOfObjects` y `selectObjectContent`. Además, la V2 reemplaza algunas clases de la V1, como `AccessControlList` y `CannedAccessControlList` con nuevas implementaciones.

**Topics**
+ [

# Diferencias del cliente S3 entre la versión 1 y la versión 2 del AWS SDK para Java
](migration-s3-client.md)
+ [

# Migre el Transfer Manager de la versión 1 a la versión 2 del AWS SDK para Java
](migration-s3-transfer-manager.md)
+ [

# Cambios en el análisis de Amazon S3 URIs de la versión 1 a la versión 2
](migration-s3-uri-parser.md)
+ [

# Cambios en la API Notificaciones de eventos de S3 de la versión 1 a la 2
](migration-s3-event-notification.md)

# Diferencias del cliente S3 entre la versión 1 y la versión 2 del AWS SDK para Java
<a name="migration-s3-client"></a>

En este tema, las diferencias entre los clientes de S3 de la versión 1 y la 2 del SDK para Java se organizan según la forma en que la [herramienta de migración](migration-tool.md) puede automatizar la migración. La herramienta admite la migración de la mayoría de los métodos de la V1 a la V2, pero algunos métodos requieren migración manual. Además de los métodos de cliente de S3, algunas clases de S3 V1 no tienen un equivalente directo de V2, por lo que es necesario migrarlas manualmente.

**Contents**
+ [

## Ejemplos de métodos V1 compatibles con la herramienta de migración
](#methods-tool-migration)
  + [

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

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

## Métodos de la V1 que requieren migración manual
](#s3-methods-manual-migration)
  + [`getObject` con `S3ObjectId`](#V1s-getObject-using-V1s-S3ObjectId)
  + [`getETag` con `ObjectMetadata`](#V1s-ObjectMetadata-using-V1s-getETag)
  + [`listNextBatchOfObjects`](#V1-listNextBatchOfObjects)
  + [`listNextBatchOfVersions`](#V1-listNextBatchOfVersions)
  + [

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

#### Ejemplo de migración
](#V1-initiateMultipartUpload-migration-ex)
    + [

#### Diferencias en implementación
](#V1-initiateMultipartUpload-impl-diffs)
  + [`setRegion`](#V1-setRegion)
  + [`setS3ClientOptions(S3ClientOptions clientOptions)`](#V1-setS3ClientOptions)
  + [`setBucketLoggingConfiguration`](#V1-setBucketLoggingConfiguration)
  + [`setBucketLifecycleConfiguration`](#V1-setBucketLifecycleConfiguration)
  + [`setBucketTaggingConfiguration`](#V1-setBucketTaggingConfiguration)
+ [

## Clases de la V1 que requieren migración manual
](#s3-classes-manual-migration)
  + [`AccessControlList`](#V1-AccessControlList)
  + [`CannedAccessControlList`](#V1-CannedAccessControlList)
  + [`BucketNotificationConfiguration`](#V1-BucketNotificationConfiguration)
  + [`MultiFactorAuthentication`](#V1-MultifactorAuthentication)

## Ejemplos de métodos V1 compatibles con la herramienta de migración
<a name="methods-tool-migration"></a>

La herramienta de migración migra automáticamente la mayoría de los métodos de la V1 a la V2. Los métodos `putObject` y `getObject` son dos ejemplos.

### `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 de la V1 que requieren migración manual
<a name="s3-methods-manual-migration"></a>

Debe migrar manualmente los siguientes métodos de cliente de S3 V1. Al utilizar la herramienta de migración, ve un comentario en el archivo de Java de salida de la V2 que le remite a este tema.

### `getObject` de V1 que utilizan `S3ObjectId` de V1 a `GetObjectRequest.builder()` de 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()` de V1 que utilizan `ObjectMetadata` de V1 a `GetObjectResponse.eTag()` de 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` de V1 a `listObjectsV2Paginator` de 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` de V1 a `listObjectVersionsPaginator` de 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` de V1 a `acl` de V2 en `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` de V1 a `acl` de V2 en `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` de V1 a `createMultipartUpload` de V2
<a name="V1-initiateMultipartUpload"></a>

#### Ejemplo de migración
<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();
```

#### Diferencias en implementación
<a name="V1-initiateMultipartUpload-impl-diffs"></a>

El valor de encabezado `Content-Type` predeterminado de los siguientes métodos es diferente según se muestra en la siguiente tabla.


****  

| Versión de SDK | Método | Valor de `Content-Type` predeterminado | 
| --- | --- | --- | 
| versión 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 | 
| versión 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 `setRegion` de V1 a `region` de V2 en compilador de clientes
<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)` de V1
<a name="V1-setS3ClientOptions"></a>

En lugar de utilizar un único objeto `S3ClientOptions` con el método `setS3ClientOptions`, V2 proporciona métodos en el compilador de clientes para configurar opciones.

### `setBucketLoggingConfiguration` de V1 a `putBucketLogging` de 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` de V1 a `putBucketLifecycleConfiguration` de 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` de V1 a `putBucketTagging` de 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);
```

## Clases de la V1 que requieren migración manual
<a name="s3-classes-manual-migration"></a>

### `AccessControlList` de V1 a `AccessControlPolicy` de 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();
```

### Enumeración `CannedAccessControlList` de V1 a la enumeraciones `BucketCannedACL` y `ObjectCannedACL` de 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` de V1 a `NotificationConfiguration` de 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 `MultiFactorAuthentication` de V1 a `mfa` de V2 en compilador de clientes
<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 el Transfer Manager de la versión 1 a la versión 2 del AWS SDK para Java
<a name="migration-s3-transfer-manager"></a>

En esta guía de migración se describen las principales diferencias entre Transfer Manager v1 y S3 Transfer Manager v2, incluidos cambios de constructores, asignaciones de métodos y código de ejemplo para operaciones comunes. Tras repasar estas diferencias, podrá migrar correctamente el código existente de Transfer Manager para aprovechar el rendimiento mejorado y las operaciones asíncronas de v2.

**Acerca de la herramienta AWS de migración del SDK**  
 AWS SDK para Java Proporciona una [herramienta de migración](migration-tool.md) automatizada que puede migrar gran parte de la API de Transfer Manager de la versión 1 a la versión 2. Sin embargo, la herramienta de migración no es compatible con varias características de Transfer Manager v1. En estos casos, deberá migrar manualmente el código de Transfer Manager siguiendo las instrucciones de este tema.  
A lo largo de esta guía, el **Estado de migración** muestra si la herramienta de migración puede migrar automáticamente un constructor, un método o una característica:  
**Compatible**: la herramienta de migración puede transformar automáticamente este código
**No compatible**: es necesario migrar el código manualmente
Incluso en el caso de los elementos marcados como “compatibles”, revise los resultados de la migración y realice pruebas exhaustivas. La migración de Transfer Manager implica cambios significativos en la arquitectura, de operaciones síncronas a asíncronas.

## Descripción general de
<a name="s3-tm-migration-overview"></a>

S3 Transfer Manager v2 introduce cambios significativos en la API de Transfer Manager. S3 Transfer Manager v2 se basa en operaciones asíncronas y ofrece un mejor rendimiento, especialmente cuando se utiliza el cliente Amazon S3 AWS basado en CRT.

### Diferencias clave
<a name="s3-tm-migration-key-differences"></a>
+ **Paquete**: `com.amazonaws.services.s3.transfer` → `software.amazon.awssdk.transfer.s3`
+ **Nombres de clase**: `TransferManager` → `S3TransferManager`
+ **Dependencia del cliente**: cliente de Amazon S3 síncrono → cliente de Amazon S3 asíncrono (`S3AsyncClient`)
+ **Arquitectura**: operaciones síncronas → operaciones asíncronas con `CompletableFuture`
+ **Rendimiento: mejorado** con soporte para clientes basado en CRT AWS 

## Cambios de alto nivel
<a name="s3-tm-migration-high-level-changes"></a>


| Aspecto | V1 | V2 | 
| --- | --- | --- | 
| Dependencia de Maven | aws-java-sdk-s3 | s3-transfer-manager | 
| Package | com.amazonaws.services.s3.transfer | software.amazon.awssdk.transfer.s3 | 
| Clase principal | TransferManager | S3TransferManager | 
| Cliente de Amazon S3 | AmazonS3 (sync) | S3AsyncClient (async) | 
| Tipos de devolución | Operaciones de bloqueo | CompletableFuture<T> | 

## dependencias 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 [Última versión.](https://central.sonatype.com/artifact/com.amazonaws/aws-java-sdk-bom). 2 [Última versión](https://central.sonatype.com/artifact/software.amazon.awssdk/bom). 3 [Última versión](https://central.sonatype.com/artifact/software.amazon.awssdk.crt/aws-crt).

## Migración de constructores de clientes
<a name="s3-tm-migration-client-constructor"></a>

### Constructores compatibles (migración automática)
<a name="s3-tm-migration-supported-constructors"></a>


| Constructor V1 | Equivalente V2 | Estado de migración | 
| --- | --- | --- | 
| new TransferManager() | S3TransferManager.create() | Soportado | 
| TransferManagerBuilder. defaultTransferManager() | S3TransferManager.create() | Soportado | 
| TransferManagerBuilder. standard().build() | S3TransferManager.builder().build() | Soportado | 
| new TransferManager(AWSCredentials) | S3TransferManager.builder() .s3Client(S3AsyncClient.builder() .credentialsProvider(...).build()) .build() | Soportado | 
| new TransferManager( AWSCredentialsProvider) | S3TransferManager.builder() .s3Client(S3AsyncClient.builder() .credentialsProvider(...).build()) .build() |  compatible | 

### Constructores no compatibles (se requiere migración manual)
<a name="s3-tm-migration-unsupported-constructors"></a>


| Constructor V1 | Equivalente V2 | Notas de migración | 
| --- | --- | --- | 
| new TransferManager(AmazonS3) | Se requiere migración manual | Cree un S3AsyncClient por separado | 
| new TransferManager(AmazonS3, ExecutorService) | Se requiere migración manual | Cree un S3AsyncClient y configure el ejecutor | 
| new TransferManager(AmazonS3, ExecutorService, boolean) | Se requiere migración manual | Parámetro shutDownThreadPools no compatible | 

### Ejemplos de migración manual
<a name="s3-tm-migration-manual-examples"></a>

**Código V1:**

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

**Código 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();
```

## Migración de métodos de cliente
<a name="s3-tm-migration-client-methods"></a>

Actualmente, la herramienta de migración admite los métodos `copy`, `download`, `upload`, `uploadDirectory`, `downloadDirectory`, `resumeDownload` y `resumeUpload` básicos.

### Métodos de transferencia principales
<a name="s3-tm-migration-core-transfer-methods"></a>


| Método V1 | Método V2 | Cambio de tipo de retorno | Estado de migración | 
| --- | --- | --- | --- | 
| upload(String, String, File) | uploadFile(UploadFileRequest) | Upload → FileUpload | Soportado | 
| upload(PutObjectRequest) | upload(UploadRequest) | Upload → Upload | Soportado | 
| download(String, String, File) | downloadFile(DownloadFileRequest) | Download → FileDownload | Soportado | 
| download(GetObjectRequest, File) | downloadFile(DownloadFileRequest) | Download → FileDownload | Soportado | 
| copy(String, String, String, String) | copy(CopyRequest) | Copy → Copy | Soportado | 
| copy(CopyObjectRequest) | copy(CopyRequest) | Copy → Copy | Soportado | 
| uploadDirectory(String, String, File, boolean) | uploadDirectory( UploadDirectoryRequest) | MultipleFileUpload → DirectoryUpload | Soportado | 
| downloadDirectory(String, String, File) | downloadDirectory( DownloadDirectoryRequest) | MultipleFileDownload → DirectoryDownload |  compatible | 

### Métodos de transferencia reanudables
<a name="s3-tm-migration-resumable-methods"></a>


| Método V1 | Método V2 | Estado de migración | 
| --- | --- | --- | 
| resumeUpload(PersistableUpload) | resumeUploadFile(ResumableFileUpload) | Soportado | 
| resumeDownload(PersistableDownload) | resumeDownloadFile(ResumableFileDownload) |  compatible | 

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


| Método V1 | Método V2 | Estado de migración | 
| --- | --- | --- | 
| shutdownNow() | close() |  compatible | 
| shutdownNow(boolean) | Ajuste el código manualmente mediante el método close() | No es compatible | 

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


| Método V1 | Alternativa V2 | Notas | 
| --- | --- | --- | 
| abortMultipartUploads(String, Date) | Use el cliente de Amazon S3 de bajo nivel | No es compatible | 
| getAmazonS3Client() | Guarde una referencia por separado | No compatible; no hay getter en v2 | 
| getConfiguration() | Guarde una referencia por separado | No compatible; no hay getter en v2 | 
| uploadFileList(...) | Realice múltiples llamadas a uploadFile() | No es compatible | 
| Métodos copy con un parámetro TransferStateChangeListener | Uso de TransferListener | [Consulte ejemplo de migración manual](#tm-unsupported-client-methods-copy) | 
| Métodos download con un parámetro S3ProgressListener | Uso de [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 el ejemplo de migración manual](#tm-unsupported-client-methods-download) | 
|  Métodos `downloadDirectory` con 4 o más parámetros  |  | [Consulte el ejemplo de migración manual](#tm-unsupported-client-methods-download-dir) | 
| Método upload con un parámetro ObjectMetadataProvider | Establezca metadatos en la solicitud | [Consulte el ejemplo de migración manual](#tm-unsupported-client-methods-upload) | 
| Métodos uploadDirectory con parámetro \$1Provider | Establezca etiquetas en la solicitud | [Consulte el ejemplo de migración manual](#tm-unsupported-client-methods-uploadDirectory) | 

#### Métodos `copy` con un 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` con un 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` con 4 o más 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` con 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` con 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);
```

## Migración de objetos del modelo
<a name="s3-tm-migration-model-objects"></a>

En AWS SDK for Java 2.x, muchos de los objetos del `TransferManager` modelo se han rediseñado y varios métodos getter y setter disponibles en los objetos del modelo de la versión 1 ya no son compatibles. 

En v2, puede usar la clase `CompletableFuture<T>` para realizar acciones cuando se complete la transferencia, ya sea correctamente o con una excepción. Si es necesario, puede usar el método `join()` para esperar a que se complete. 

### Objetos de transferencia principales
<a name="s3-tm-migration-core-transfer-objects"></a>


| Clase V1 | Clase V2 | Estado de migración | 
| --- | --- | --- | 
| TransferManager | S3TransferManager | Soportado | 
| TransferManagerBuilder | S3TransferManager.Builder | Soportado | 
| Transfer | Transfer |  compatible | 
| AbortableTransfer | Transfer | Compatible (sin clase aparte) | 
| Copy | Copy | Soportado | 
| Download | FileDownload | Soportado | 
| Upload | Upload / FileUpload | Soportado | 
| MultipleFileDownload | DirectoryDownload | Soportado | 
| MultipleFileUpload | DirectoryUpload |  compatible | 

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


| Clase V1 | Clase V2 | Estado de migración | 
| --- | --- | --- | 
| PersistableDownload | ResumableFileDownload | Soportado | 
| PersistableUpload | ResumableFileUpload | Soportado | 
| PersistableTransfer | ResumableTransfer |  compatible | 
| PauseResult<T> | Objeto reanudable directo | No es compatible | 

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


| Clase V1 | Clase V2 | Estado de migración | 
| --- | --- | --- | 
| CopyResult | CompletedCopy | Soportado | 
| UploadResult | CompletedUpload |  compatible | 

### Objetos de configuración
<a name="s3-tm-migration-configuration-objects"></a>


| Clase V1 | Clase V2 | Estado de migración | 
| --- | --- | --- | 
| TransferManagerConfiguration | MultipartConfiguration (en el cliente de Amazon S3) | Soportado | 
| TransferProgress | TransferProgress \$1 TransferProgressSnapshot | Soportado | 
| KeyFilter | DownloadFilter |  compatible | 

### Objetos no admitidos
<a name="s3-tm-migration-unsupported-objects"></a>


| Clase V1 | Alternativa V2 | Estado de migración | 
| --- | --- | --- | 
| PauseStatus | No admitido | No es compatible | 
| UploadContext | No admitido | No es compatible | 
| ObjectCannedAclProvider | PutObjectRequest.builder().acl() | No es compatible | 
| ObjectMetadataProvider | PutObjectRequest.builder().metadata() | No es compatible | 
| ObjectTaggingProvider | PutObjectRequest.builder().tagging() | No es compatible | 
| PresignedUrlDownload | No admitido | No es compatible | 

## TransferManagerBuilder migración de la configuración
<a name="s3-tm-migration-builder-configuration"></a>

### Cambios de configuración
<a name="migration-transfer-manager-config-changes"></a>

Los cambios de configuración que debe establecer para Transfer Manager v2 dependen del cliente de S3 que utilice. Puede elegir entre el cliente S3 AWS basado en CRT o el cliente asíncrono S3 estándar basado en Java. Para obtener más información acerca de las diferencias, consulte el tema [Clientes S3 en el AWS SDK for Java 2.x](examples-s3.md#s3-clients).

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


****  

| Opción | v1 | v2: Transfer Manager utiliza un cliente S3 basado en CRT AWS  | 
| --- | --- | --- | 
|    (conseguir un compilador)  |  <pre>TransferManagerBuilder tmBuilder = <br />   TransferManagerBuilder.standard();</pre>  |  <pre>S3TransferManager.Builder tmBuilder  = <br />  S3TransferManager.builder();</pre>  | 
|    cliente S3  |  <pre>tmBuilder.withS3Client(...);<br />tmBuilder.setS3Client(...);</pre>  |  <pre>tmBuilder.s3Client(...);</pre>  | 
|    Ejecutor  |  <pre>tmBuilder.withExecutorFactory(...);<br />tmBuilder.setExecutorFactory(...);</pre>  |  <pre>tmBuilder.executor(...);</pre>  | 
|    Cerrar los grupos de hilos  |  <pre>tmBuilder.withShutDownThreadPools(...);<br />tmBuilder.setShutdownThreadPools(...);</pre>  | No admitido. El ejecutor proporcionado no se cerrará cuando se cierre S3TransferManager | 
|    Tamaño mínimo de la pieza de carga  |  <pre>tmBuilder.withMinimumUploadPartSize(...);<br />tmBuilder.setMinimumUploadPartSize(...);</pre>  |  <pre>S3AsyncClient s3 = S3AsyncClient.crtBuilder().<br />      minimumPartSizeInBytes(...).build();<br /><br />tmBuilder.s3Client(s3);</pre>  | 
|    Umbral de la carga multiparte  |  <pre>tmBuilder.withMultipartUploadThreshold(...);<br />tmBuilder.setMultipartUploadThreshold(...);</pre>  |  <pre>S3AsyncClient s3 = S3AsyncClient.crtBuilder().<br />      thresholdInBytes(...).build();<br /><br />tmBuilder.s3Client(s3);</pre>  | 
|    Tamaño mínimo de la pieza de copia  |  <pre>tmBuilder.withMultipartCopyPartSize(...);<br />tmBuilder.setMultipartCopyPartSize(...);</pre>  |  <pre>S3AsyncClient s3 = S3AsyncClient.crtBuilder().<br />      minimumPartSizeInBytes(...).build();<br /><br />tmBuilder.s3Client(s3);</pre>  | 
|    Umbral de copia multiparte  |  <pre>tmBuilder.withMultipartCopyThreshold(...);<br />tmBuilder.setMultipartCopyThreshold(...);</pre>  |  <pre>S3AsyncClient s3 = S3AsyncClient.crtBuilder().<br />      thresholdInBytes(...).build();<br /><br />tmBuilder.s3Client(s3);</pre>  | 
|    Inhabilitar descargas paralelas  |  <pre>tmBuilder.withDisableParallelDownloads(...);<br />tmBuilder.setDisableParallelDownloads(...);</pre>  | Deshabilite las descargas paralelas pasando un cliente de S3 estándar basado en Java con multiparte deshabilitada (opción predeterminada) a Transfer Manager.<pre>S3AsyncClient s3 =<br />   S3AsyncClient.builder().build();<br /><br />tmBuilder.s3Client(s3);</pre> | 
|    Calcular siempre md5 multiparte  |  <pre>tmBuilder.withAlwaysCalculateMultipartMd5(...);<br />tmBuilder.setAlwaysCalculateMultipartMd5(...);</pre>  | No admitido. | 

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


****  

| Opción | v1 | v2: Transfer Manager con el cliente asíncrono de S3 basado en Java | 
| --- | --- | --- | 
|    (conseguir un compilador)  |  <pre>TransferManagerBuilder tmBuilder = <br />   TransferManagerBuilder.standard();</pre>  |  <pre>S3TransferManager.Builder tmBuilder  = <br />  S3TransferManager.builder();</pre>  | 
|    cliente S3  |  <pre>tmBuilder.withS3Client(...);<br />tmBuilder.setS3Client(...);</pre>  |  <pre>tmBuilder.s3Client(...);</pre>  | 
|    Ejecutor  |  <pre>tmBuilder.withExecutorFactory(...);<br />tmBuilder.setExecutorFactory(...);</pre>  |  <pre>tmBuilder.executor(...);</pre>  | 
|    Cerrar los grupos de hilos  |  <pre>tmBuilder.withShutDownThreadPools(...);<br />tmBuilder.setShutdownThreadPools(...);</pre>  | No admitido. El ejecutor proporcionado no se cerrará cuando se cierre S3TransferManager | 
|    Tamaño mínimo de la pieza de carga  |  <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>  | 
|    Umbral de la carga multiparte  |  <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>  | 
|    Tamaño mínimo de la pieza de copia  |  <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>  | 
|    Umbral de copia multiparte  |  <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>  | 
|    Inhabilitar descargas paralelas  |  <pre>tmBuilder.withDisableParallelDownloads(...);<br />tmBuilder.setDisableParallelDownloads(...);</pre>  | Deshabilite las descargas paralelas pasando un cliente de S3 estándar basado en Java con multiparte deshabilitada (opción predeterminada) a Transfer Manager.<pre>S3AsyncClient s3 =<br />   S3AsyncClient.builder().build();<br /><br />tmBuilder.s3Client(s3);</pre> | 
|    Calcular siempre md5 multiparte  |  <pre>tmBuilder.withAlwaysCalculateMultipartMd5(...);<br />tmBuilder.setAlwaysCalculateMultipartMd5(...);</pre>  | No admitido. | 

------

## Cambios de comportamiento
<a name="s3-tm-migration-behavior-changes"></a>

### Operaciones asíncronas
<a name="s3-tm-migration-async-operations"></a>

**V1 (bloqueo):**

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

**V2 (asincrónico):**

```
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());
});
```

### Gestión de errores
<a name="s3-tm-migration-error-handling"></a>

**V1:** las transferencias de directorio fallan por completo si se produce un error en alguna solicitud secundaria.

**V2:** las transferencias de directorio se completan correctamente incluso aunque fallen algunas solicitudes secundarias. Compruebe si hay errores 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()));
}
```

### Descarga paralela mediante búsquedas por rango de bytes
<a name="migration-transfer-manager-behavior-fetches"></a>

Cuando la característica de transferencia paralela automática está habilitada en el SDK v2, Transfer Manager de S3 utiliza [recuperaciones de rango de byte](https://docs.aws.amazon.com/AmazonS3/latest/userguide/optimizing-performance-guidelines.html#optimizing-performance-guidelines-get-range) para recuperar partes específicas del objeto en paralelo (descarga de multiparte). La forma en que se descarga un objeto con la versión 2 no depende de cómo se cargó originalmente. Todas las descargas pueden beneficiarse de un alto rendimiento y simultaneidad. 

Por el contrario, con Transfer Manager v1 es importante cómo se cargó originalmente el objeto. Transfer Manager v1 recupera las partes del objeto de la misma forma en que se cargaron las partes. Si un objeto se cargó originalmente como un objeto único, Transfer Manager v1 no puede acelerar el proceso de descarga mediante solicitudes secundarias.

# Cambios en el análisis de Amazon S3 URIs de la versión 1 a la versión 2
<a name="migration-s3-uri-parser"></a>

En este tema se detallan los cambios en el análisis de Amazon S3 URIs de la versión 1 (v1) a la versión 2 (v2.).

## Cambios de alto nivel
<a name="migration-3-uri-parser-api-changes"></a>

Para empezar a analizar un URI de S3 en la v1, cree una instancia de un `AmazonS3URI` utilizando un constructor. En la v2, llame a `parseUri()` en una instancia de `S3Utilities` para devolver un `S3URI`.


****  

| Cambio | v1 |   v2 | 
| --- | --- | --- | 
|    dependencias 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>  | 
| Nombre del paquete | com.amazonaws.services.s3 | software.amazon.awssdk.services.s3 | 
| Nombres de clase | [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 [Última versión](https://central.sonatype.com/artifact/com.amazonaws/aws-java-sdk-bom). 2 [Última versión](https://central.sonatype.com/artifact/software.amazon.awssdk/bom).

## Cambios en la API
<a name="migration-3-uri-parser-api-changes"></a>


| Comportamiento | v1 |   v2 | 
| --- | --- | --- | 
| Analizar un URI de 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>  | 
| Recuperar el nombre del bucket de un URI de S3. |  <pre>String bucket = s3Uri.getBucket();</pre>  |  <pre>Optional<String> bucket = s3Uri.bucket();</pre>  | 
| Recuperar la clave. |  <pre>String key = s3Uri.getKey();</pre>  |  <pre>Optional<String> key = s3Uri.key();</pre>  | 
| Recuperar la región. |  <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>  | 
|  Recuperar si el URI de S3 es de estilo de ruta.  |  <pre>boolean isPathStyle = s3Uri.isPathStyle();</pre>  |  <pre>boolean isPathStyle = s3Uri.isPathStyle();</pre>  | 
| Recuperar el ID de versión. |  <pre>String versionId = s3Uri.getVersionId();</pre>  |  <pre>Optional<String> versionId = <br />    s3Uri.firstMatchingRawQueryParameter("versionId");</pre>  | 
| Recuperar los parámetros de consulta. | N/A |  <pre>Map<String, List<String>> queryParams =<br />    s3Uri.rawQueryParameters();</pre>  | 

### Cambios de comportamiento
<a name="migration-s3-uri-parser-behavior-changes"></a>

#### Codificación de URL
<a name="migration-s3-uri-parser-behavior-changes-URLencoding"></a>

La v1 ofrece la opción de pasar una marca para especificar si el URI debe estar codificado como URL. El valor predeterminado es `true`. 

En la v2 no se admite codificación de URL. Si trabaja con claves de objeto o parámetros de consulta que tienen caracteres reservados o no seguros, debe codificarlos mediante URL. Por ejemplo, debe reemplazar un espacio en blanco `" "` por `%20`.

# Cambios en la API Notificaciones de eventos de S3 de la versión 1 a la 2
<a name="migration-s3-event-notification"></a>

En este tema se detallan los cambios en la API Notificaciones de eventos de S3 de la versión 1.x (v1) a la versión 2.x (v2) de AWS SDK para Java.

## Cambios de alto nivel
<a name="migration-s3-event-notification-hl"></a>

### Cambios estructurales
<a name="migration-s3-event-notification-hl-struct"></a>

La V1 usa clases internas estáticas para tipos `EventNotificationRecord` y sus atributos, mientras que la v2 usa clases públicas independientes para tipos `EventNotificationRecord`.

### Cambios en la convención de nomenclatura
<a name="migration-s3-event-notification-hl-naming"></a>

En v1, los nombres de las clases de atributos incluyen el sufijo *Entity*, mientras que v2 omite este sufijo para simplificar la nomenclatura: por ejemplo, *EventData* en lugar de. *eventDataEntity*

## Cambios en dependencias, paquetes y nombres de clases
<a name="migration-s3-event-notification-deps"></a>

En la v1, las clases de la API Notificación de eventos de S3 se importan de forma transitiva junto con el módulo S3 (artifactId `aws-java-sdk-s3`). Sin embargo, en la v2 es necesario añadir una dependencia al artefacto `s3-event-notifications`.


****  

| Cambio | v1 |   v2 | 
| --- | --- | --- | 
|    dependencias 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>  | 
| Nombre del paquete | com.amazonaws.services.s3.event | software.amazon.awssdk.eventnotifications.s3.model | 
| Nombres de clase |  [S3EventNotification](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/event/S3EventNotification.html) [S3 S.3 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 EventNotification S3 BucketEntity](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/event/S3EventNotification.S3BucketEntity.html) [Entidad S3 S.3 EventNotification](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/event/S3EventNotification.S3Entity.html) [EventNotificationS3 S3. 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 [Última versión](https://central.sonatype.com/artifact/software.amazon.awssdk/bom).

## Cambios en la API
<a name="migration-s3-event-notification-API-changes"></a>

### JSON a `S3EventNotification` y a la inversa
<a name="migration-s3-event-notification-API-changes-conv"></a>


| Caso de uso | v1 |   v2 | 
| --- | --- | --- | 
| Crear S3EventNotification a partir de cadena JSON |  <pre>S3EventNotification notification = <br />        S3EventNotification.parseJson(message.body());</pre>  |  <pre>S3EventNotification notification = <br />        S3EventNotification.fromJson(message.body());</pre>  | 
| Convertir S3EventNotification a cadena JSON |  <pre>String json = notification.toJson();</pre>  |  <pre>String json = notification.toJson();</pre>  | 

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


| Caso de uso | v1 |   v2 | 
| --- | --- | --- | 
| Recuperar registros de una notificación |  <pre>List<S3EventNotification.S3EventNotificationRecord> records = <br />        notifcation.getRecords();</pre>  |  <pre>List<S3EventNotificationRecord> records = <br />        notification.getRecords();</pre>  | 
| Recuperar un registro de una lista de registros |  <pre>S3EventNotification.S3EventNotificationRecord record = <br />        records.stream().findAny().get();</pre>  |  <pre>S3EventNotificationRecord record = <br />        records.stream().findAny().get();</pre>  | 
| Recuperar datos de eventos de Glacier |  <pre>S3EventNotification.GlacierEventDataEntity glacierEventData =<br />        record.getGlacierEventData();</pre>  |  <pre>GlacierEventData glacierEventData = <br />        record.getGlacierEventData();</pre>  | 
| Recuperar datos de eventos de restauración de un evento de Glacier |  <pre>S3EventNotification.RestoreEventDataEntity restoreEventData = <br />        glacierEventData.getRestoreEventDataEntity();</pre>  |  <pre>RestoreEventData restoreEventData = <br />        glacierEventData.getRestoreEventData();</pre>  | 
| Recuperar parámetros de solicitudes |  <pre>S3EventNotification.RequestParametersEntity requestParameters = <br />        record.getRequestParameters();</pre>  |  <pre>RequestParameters requestParameters = <br />        record.getRequestParameters();</pre>  | 
| Recuperar datos de los eventos de Intelligent Tiering |  <pre>S3EventNotification.IntelligentTieringEventDataEntity tieringEventData = <br />        record.getIntelligentTieringEventData();</pre>  |  <pre>IntelligentTieringEventData intelligentTieringEventData = <br />        record.getIntelligentTieringEventData();</pre>  | 
| Recuperar datos de eventos del ciclo de vida |  <pre>S3EventNotification.LifecycleEventDataEntity lifecycleEventData = <br />        record.getLifecycleEventData();</pre>  |  <pre>LifecycleEventData lifecycleEventData = <br />        record.getLifecycleEventData();</pre>  | 
| Recuperar nombre del evento como enumeración |  <pre>S3Event eventNameAsEnum = record.getEventNameAsEnum();</pre>  |  <pre>//getEventNameAsEnum does not exist; use 'getEventName()'<br />String eventName = record.getEventName();</pre>  | 
| Recuperar datos de eventos de replicación |  <pre>S3EventNotification.ReplicationEventDataEntity replicationEntity = <br />        record.getReplicationEventDataEntity();</pre>  |  <pre>ReplicationEventData replicationEventData = <br />        record.getReplicationEventData();</pre>  | 
| Recuperar información de buckets y objetos de S3 |  <pre>S3EventNotification.S3Entity s3 = record.getS3();</pre>  |  <pre>S3 s3 = record.getS3();</pre>  | 
| Recuperar información de identidad de usuario |  <pre>S3EventNotification.UserIdentityEntity userIdentity = <br />        record.getUserIdentity();</pre>  |  <pre>UserIdentity userIdentity = <br />        record.getUserIdentity();</pre>  | 
| Recuperar elementos de respuesta |  <pre>S3EventNotification.ResponseElementsEntity responseElements = <br />        record.getResponseElements();</pre>  |  <pre>ResponseElements responseElements = <br />        record.getResponseElements();</pre>  | 

## Migración de la versión de la biblioteca `aws-lambda-java-events`
<a name="migration-s3-events-notification-lambda-lib"></a>

Si [aws-lambda-java-events](https://github.com/aws/aws-lambda-java-libs/tree/main/aws-lambda-java-events)solía trabajar con eventos de notificación de S3 dentro de una función Lambda, le recomendamos que actualice a la última versión 3.x.x. Las versiones recientes eliminan todas las dependencias de la API de notificación de eventos de S3 con la versión AWS SDK para Java 1.x.

Para obtener más información sobre las diferencias en el tratamiento de notificaciones de eventos de S3 entre la biblioteca `aws-lambda-java-events` y el SDK para Java 2.x, consulte [Procese eventos de S3 en Lambda con bibliotecas Java: y AWS SDK for Java 2.x `aws-lambda-java-events`](examples-s3-event-notifications.md#s3-event-notif-processing-options).

# Cambios del archivo de perfil
<a name="migration-profile-file"></a>

AWS SDK for Java 2.x analiza las definiciones de perfil en `~/.aws/config` y `~/.aws/credentials` para emular más de cerca la forma en que la AWS CLI analiza los archivos.

El SDK para Java 2.x:
+ Resuelve `~/` o `~` seguido del separador de rutas predeterminado del sistema de archivos al principio de la ruta comprobando, en orden, `$HOME`, `$USERPROFILE` (solo Windows), `$HOMEDRIVE`, `$HOMEPATH` (solo Windows) y, a continuación, la propiedad del sistema `user.home`.
+ Busca la variable de entorno de `AWS_SHARED_CREDENTIALS_FILE` en lugar de `AWS_CREDENTIAL_PROFILES_FILE`.
+ Elimina silenciosamente las definiciones de perfil en los archivos de configuración sin la palabra `profile` al principio del nombre del perfil.
+ Elimina silenciosamente las definiciones de perfil que no estén compuestas por caracteres alfanuméricos, guiones bajos o guiones (una vez eliminada la palabra principal de `profile` de los archivos de configuración).
+ Combina los ajustes de definiciones de perfil duplicados en el mismo archivo.
+ Combina los ajustes de definiciones de perfil duplicados en los archivos de configuración y de credenciales.
+ NO combina los ajustes si `[profile foo]` y `[foo]` se encuentran en el mismo archivo.
+ Utiliza ajustes en `[profile foo]` si `[profile foo]` y `[foo]` se encuentran en el archivo de configuración.
+ Utiliza el valor del último ajuste duplicado en el mismo archivo y perfil.
+ Reconoce `;` y `#` para definir un comentario.
+ Reconoce `;` y `#` en definiciones de perfil para definir un comentario, incluso aunque los caracteres estén junto al corchete de cierre.
+ Reconoce `;` y `#` para definir un comentario solo al establecer valores si van precedidos de espacios en blanco.
+ Reconoce `;` y `#` y todo el contenido siguiente al establecer valores si no van precedidos de espacios en blanco.
+ Considera que las credenciales basadas en roles son las credenciales de mayor prioridad. El SDK 2.x siempre usa credenciales basadas en roles si el usuario especifica la propiedad `role_arn`.
+ Considera que las credenciales basadas en sesiones son las credenciales con la segunda mayor prioridad. El SDK 2.x siempre usa credenciales basadas en sesiones si no se han utilizado credenciales basadas en roles y el usuario especifica las propiedades `aws_access_key_id` y `aws_session_token`.
+ Utiliza credenciales básicas si las credenciales basadas en roles y basadas en sesiones no se utilizan y el usuario ha especificado la propiedad `aws_access_key_id`.

# Cambios en variables de entorno y propiedades del sistema
<a name="migration-env-and-system-props"></a>


| Variable de entorno 1.x | Propiedad del sistema 1.x | Variable de entorno 2.x | Propiedad del sistema 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 | No se admite ([característica de solicitud](https://github.com/aws/aws-sdk-java-v2/issues/new)) | No se admite ([característica de solicitud](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
|   | com.amazonaws.sdk.enableDefaultMetrics | [No admitido](https://github.com/aws/aws-sdk-java-v2/issues/23) | [No admitido](https://github.com/aws/aws-sdk-java-v2/issues/23) | 
|   | com.amazonaws.sdk.enableThrottledRetry | [No admitido](https://github.com/aws/aws-sdk-java-v2/issues/645) | [No admitido](https://github.com/aws/aws-sdk-java-v2/issues/645) | 
|   | com.amazonaws.regions.RegionUtils.fileOverride | No se admite ([característica de solicitud](https://github.com/aws/aws-sdk-java-v2/issues/new)) | No se admite ([característica de solicitud](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
|   | com.amazonaws.regions.RegionUtils.disableRemote | No se admite ([característica de solicitud](https://github.com/aws/aws-sdk-java-v2/issues/new)) | No se admite ([característica de solicitud](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
|   | com.amazonaws.services.s3.disableImplicitGlobalClients | No se admite ([característica de solicitud](https://github.com/aws/aws-sdk-java-v2/issues/new)) | No se admite ([característica de solicitud](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
|   | com.amazonaws.sdk.enableInRegionOptimizedMode | No se admite ([característica de solicitud](https://github.com/aws/aws-sdk-java-v2/issues/new)) | No se admite ([característica de solicitud](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 

# Cambios en esperadores de la versión 1 a la versión 2
<a name="migration-waiters"></a>

En este tema se detallan los cambios en la funcionalidad de esperadores de la versión 1 (v1) a la versión 2 (v2).

En las siguientes tablas se muestra la diferencia específicamente para los esperadores de DynamoDB. Los esperadores de otros servicios siguen el mismo patrón.

## Cambios de alto nivel
<a name="migration-waiters-api-changes"></a>

Las clases de esperadores tienen el mismo artefacto de Maven que el servicio. 


| Cambio | v1 | v2 | 
| --- | --- | --- | 
|    dependencias 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>  | 
| Package name | com.amazonaws.services.dynamodbv2.waiters | software.amazon.awssdk.services.dynamodb.waiters | 
| Nombres de clase |  `[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/es_es/sdk-for-java/latest/developer-guide/migration-waiters.html)  | 

1 [Última versión](https://central.sonatype.com/artifact/com.amazonaws/aws-java-sdk-bom). 2 [Última versión](https://central.sonatype.com/artifact/software.amazon.awssdk/bom).

## Cambios en la API
<a name="migration-cf-presign-behavior-changes"></a>


| Cambio | v1 | v2 | 
| --- | --- | --- | 
| Cree un esperador |  <pre>AmazonDynamoDB client = AmazonDynamoDBClientBuilder <br />                            .standard().build();<br />AmazonDynamoDBWaiters waiter = client.waiters();</pre>  | Sincrónico:<pre>DynamoDbClient client = DynamoDbClient.create();<br />DynamoDbWaiter waiter = client.waiter();</pre>Asincrónico:<pre>DynamoDbAsyncClient asyncClient = <br />        DynamoDbAsyncClient.create();<br />DynamoDbAsyncWaiter waiter = asyncClient.waiter();</pre> | 
| Espere a que haya una tabla | Sincrónico:<pre>waiter.tableExists()<br />    .run(new WaiterParameters<>(<br />        new DescribeTableRequest(tableName)));</pre>Asincrónico:<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> |  Sincrónico: <pre>WaiterResponse<DescribeTableResponse> waiterResponse =<br />    waiter.waitUntilTableExists(<br />        r -> r.tableName("myTable"));<br />waiterResponse.matched().response()<br />       .ifPresent(System.out::println);</pre> Asincrónico: <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>  | 

## Cambios de configuración
<a name="migration-waiters-config"></a>


| Cambio | v1 | v2 | 
| --- | --- | --- | 
| Estrategia de sondeo (número máximo de intentos y retraso fijo) |  <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>  | 

# Cambios en la utilidad de metadatos de EC2 de la versión 1 a versión 2
<a name="migration-imds"></a>

En este tema se detallan los cambios en la utilidad de metadatos Amazon Elastic Compute Cloud (EC2) del SDK para Java de la versión 1 (v1) a la versión 2 (v2).

## Cambios de alto nivel
<a name="migration-imds-high-level-changes"></a>


****  

| Cambio | v1 |   v2 | 
| --- | --- | --- | 
|    dependencias 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>  | 
| Nombre del paquete |  com.amazonaws.util  |  software.amazon.awssdk.imds  | 
| Enfoque de instanciación |  Utilice métodos de utilidad estáticos; sin instanciación: <pre>String localHostName = <br />           EC2MetadataUtils.getLocalHostName();</pre>  |  Utilice un método de fábrica estático: <pre>Ec2MetadataClient client = Ec2MetadataClient.create();</pre> O utilice un enfoque de creación: <pre>Ec2MetadataClient client = Ec2MetadataClient.builder()<br />    .endpointMode(EndpointMode.IPV6)<br />    .build();</pre>  | 
| Tipos de clientes | Métodos de utilidad únicamente síncronos: EC2MetadataUtils |  Síncrono: `Ec2MetadataClient` Asíncrono: `Ec2MetadataAsyncClient`  | 

1 [Última versión](https://central.sonatype.com/artifact/com.amazonaws/aws-java-sdk-bom). 2 [Última versión](https://central.sonatype.com/artifact/software.amazon.awssdk/bom).

3 Observe la declaración del módulo `apache-client` para la versión 2. La versión 2 de la utilidad de metadatos EC2 requiere una implementación de la interfaz `SdkHttpClient` para el cliente de metadatos síncrono o la interfaz `SdkAsyncHttpClient` para el cliente de metadatos asíncrono. La sección [Configure los clientes HTTP en el AWS SDK for Java 2.x](http-configuration.md) muestra la lista de clientes HTTP que puede utilizar.

### Solicitar metadatos
<a name="migration-imds-fetching-changes"></a>

En la versión 1, se utilizan métodos estáticos que no aceptan parámetros para solicitar metadatos para un recurso de EC2. Por el contrario, debe especificar la ruta al recurso de EC2 como parámetro en la v2. En la tabla siguiente, se muestran los diferentes enfoques.


****  

| v1 |   v2 | 
| --- | --- | 
|  <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 las [categorías de metadatos de la instancia](https://docs.aws.amazon.com//AWSEC2/latest/UserGuide/instancedata-data-categories.html) para encontrar la ruta que necesita proporcionar para solicitar un fragmento de metadatos. 

**nota**  
Cuando utilice un cliente de metadatos de instancia en la versión 2, debe intentar usar el mismo cliente para todas las solicitudes de recuperación de metadatos.

 

## Cambios de comportamiento
<a name="migration-imds-behavior-changes"></a>

### Datos JSON
<a name="migration-imds-behavior-json"></a>

En EC2, el Servicio de metadatos de instancias (IMDS) que se ejecuta localmente devuelve algunos metadatos en forma de cadenas con formato JSON. Un ejemplo de ello son los metadatos dinámicos de un [documento de identidad de instancias](https://docs.aws.amazon.com//AWSEC2/latest/UserGuide/instance-identity-documents.html).

La API v1 contiene métodos independientes para cada elemento de metadatos de identidad de la instancia, mientras que la API v2 devuelve directamente la cadena JSON. Para trabajar con la cadena JSON, puede usar la [API de documentos](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/core/document/package-summary.html) para analizar la respuesta y navegar por la estructura JSON.

En la siguiente tabla, se compara la forma de recuperar los metadatos de un documento de identidad de instancia en las versiones 1 y 2.


****  

| Caso de uso | v1 |   v2 | 
| --- | --- | --- | 
| Recuperar la región |  <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>  | 
| Recupera el identificador de la instancia |  <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>  | 
| Recupera el tipo de la instancia |  <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>  | 

### Diferencias en la resolución de punto de conexión
<a name="migration-imds-behavior-endpoint-res"></a>

La siguiente tabla muestra las ubicaciones que el SDK comprueba para resolver el punto de conexión en el IMDS. Las ubicaciones se muestran en orden de prioridad descendente.


****  

| v1 |   v2 | 
| --- | --- | 
| Propiedad del sistema: com.amazonaws.sdk.ec2MetadataServiceEndpointOverride | Método de configuración del creador de clientes: endpoint(...) | 
| Variable de entorno: AWS\$1EC2\$1METADATA\$1SERVICE\$1ENDPOINT | Propiedad del sistema: aws.ec2MetadataServiceEndpoint | 
| Valor predeterminado: http://169.254.169.254 | Archivo de configuración: \$1.aws/config con la configuración ec2\$1metadata\$1service\$1endpoint | 
|  | Valor asociado a endpoint-mode resuelto  | 
|  | Valor predeterminado: http://169.254.169.254 | 

### Resolución del punto de conexión en la versión 2
<a name="migration-imds-behavior-endpoint-res2"></a>

Cuando se establece explícitamente un punto de conexión mediante el creador, el valor de ese punto de conexión tiene prioridad sobre todos los demás ajustes. Cuando se ejecuta el siguiente código, la propiedad del sistema `aws.ec2MetadataServiceEndpoint` y el ajuste `ec2_metadata_service_endpoint` del archivo de configuración se ignoran si existen.

```
Ec2MetadataClient client = Ec2MetadataClient
  .builder()
  .endpoint(URI.create("endpoint.to.use"))
  .build();
```

#### Modo de punto de conexión
<a name="migration-imds-behavior-endpoint-mode"></a>

Con la versión 2, puede especificar un modo de punto final para configurar el cliente de metadatos de modo que utilice los valores de punto final predeterminados para o. IPv4 IPv6 El modo de punto de conexión no está disponible para la versión 1. El valor predeterminado utilizado para IPv4 es `http://169.254.169.254` y para. `http://[fd00:ec2::254]` IPv6

En la siguiente tabla se muestran las distintas formas de configurar el modo de punto de conexión en orden descendente de prioridad.


****  

|  |  | Valores posibles | 
| --- | --- | --- | 
| Método de configuración del creador de clientes: endpointMode(...) |  <pre>Ec2MetadataClient client = Ec2MetadataClient<br />  .builder()<br />  .endpointMode(EndpointMode.IPV4)<br />  .build();</pre>  | EndpointMode.IPV4, EndpointMode.IPV6 | 
| Propiedad del sistema | aws.ec2MetadataServiceEndpointMode | IPv4, IPv6 (no distingue entre mayúsculas y minúsculas) | 
| Archivo de configuración: \$1.aws/config | Ajuste ec2\$1metadata\$1service\$1endpoint | IPv4, IPv6 (no distingue entre mayúsculas y minúsculas) | 
| No especificado de las formas anteriores | IPv4 se utiliza |  | 

#### Cómo resuelve el SDK `endpoint` o `endpoint-mode` en la versión 2
<a name="migration-imds-behavior-endpoint-res2-which"></a>

1. El SDK usa el valor que se establece en el código del creador de clientes e ignora cualquier configuración externa. Como el SDK genera una excepción si ambos `endpoint` y `endpointMode` se invocan en el creador de clientes, el SDK usa el valor de punto de conexión del método que utilice.

1. Si no establece un valor en el código, el SDK busca en la configuración externa primero las propiedades del sistema y, después, una configuración en el archivo de configuración. 

   1. El SDK primero comprueba si hay un valor de punto de conexión. Si se encuentra un valor, se usa. 

   1. Si el SDK sigue sin encontrar ningún valor, busca la configuración del modo de punto de conexión.

1. Por último, si el SDK no encuentra ninguna configuración externa y usted no ha configurado el cliente de metadatos en el código, el SDK utiliza el IPv4 valor de`http://169.254.169.254`.

### IMDSv2
<a name="migration-imds-behavior-imdsv2"></a>

Amazon EC2 define dos enfoques para acceder a los metadatos de las instancias:
+ Versión 1 del servicio de metadatos de instancia (IMDSv1): enfoque de solicitud/respuesta
+ Instance Metadata Service, versión 2 (IMDSv2): enfoque orientado a la sesión

En la siguiente tabla se compara el SDKs funcionamiento de Java con el IMDS.


****  

| v1 |   v2 | 
| --- | --- | 
| IMDSv2 se usa de forma predeterminada | Siempre usa IMDSv2 | 
| Intenta obtener un token de sesión para cada solicitud y recurre a él IMDSv1 si no consigue recuperar un token de sesión | Mantiene un token de sesión en una caché interna que se reutiliza para múltiples solicitudes | 

El SDK para Java 2.x solo admite IMDSv2 y no recurre a IMDSv1.

## Diferencias de configuración
<a name="migration-imds-config-diffs"></a>

En la tabla siguiente se muestran las diferentes opciones de configuración.


****  

| Configuración | v1 |   v2 | 
| --- | --- | --- | 
| Reintentos | La configuración no está disponible | Configurable mediante el método de creador retryPolicy(...) | 
| HTTP | El tiempo de espera de la conexión se puede configurar mediante la variable de entorno de AWS\$1METADATA\$1SERVICE\$1TIMEOUT. El valor predeterminado es de 1 segundo. | La configuración está disponible pasando un cliente HTTP al método de creador httpClient(...). El tiempo de espera de conexión predeterminado para los clientes HTTP es de 2 segundos. | 

### Ejemplo de configuración HTTP v2
<a name="migration-imds-http-conf-v2-ex"></a>

En el siguiente ejemplo, se muestra cómo se puede configurar el cliente de metadatos. En este ejemplo se configura el tiempo de espera de la conexión y se utiliza el cliente HTTP Apache.

```
SdkHttpClient httpClient = ApacheHttpClient.builder()
    .connectionTimeout(Duration.ofSeconds(1))
    .build();

Ec2MetadataClient imdsClient = Ec2MetadataClient.builder()
    .httpClient(httpClient)
    .build();
```

# Cambios en la CloudFront presignación de Amazon de la versión 1 a la versión 2
<a name="migration-cloudfront-presigning"></a>

En este tema se detallan los cambios en Amazon CloudFront desde la versión 1 (v1) a la versión 2 (v2).

## Cambios de alto nivel
<a name="migration-cloudfront-presigning-api-changes"></a>


****  

| Cambio | v1 |   v2 | 
| --- | --- | --- | 
|    dependencias 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>  | 
| Nombre del paquete | com.amazonaws.services.cloudfront | software.amazon.awssdk.services.cloudfront | 
| Nombres de clase |  [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 [Última versión](https://central.sonatype.com/artifact/com.amazonaws/aws-java-sdk-bom). 2 [Última versión](https://central.sonatype.com/artifact/software.amazon.awssdk/bom).

## Cambios en la API
<a name="migration-cf-presign-behavior-changes"></a>


| Comportamiento | v1 |   v2 | 
| --- | --- | --- | 
| Creación de una solicitud predefinida | Los argumentos se pasan directamente a la API. |  <pre>CannedSignerRequest cannedRequest =<br />      CannedSignerRequest.builder()<br />                         .resourceUrl(resourceUrl)<br />                         .privateKey(privateKey)<br />                         .keyPairId(keyPairId)<br />                         .expirationDate(expirationDate)<br />                         .build();</pre>  | 
| Creación de una solicitud de personalizada | Los argumentos se pasan directamente a la 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>  | 
| Generación de una URL firmada (predefinida) |  <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>  | 
| Generación de una cookie firmada (personalizada) |  <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>  | 

### Se han refactorizado los encabezados de cookies en v2
<a name="migration-cf-presign-behavior-headers"></a>

En Java v1, el SDK de Java proporciona encabezados de cookies como `Map.Entry<String, String>`.

```
Map.Entry<String, String> signatureMap = cookies.getSignature();
String signatureKey = signatureMap.getKey(); // "CloudFront-Signature"
String signatureValue = signatureMap.getValue(); // "[SIGNATURE_VALUE]"
```

El SDK de Java v2 ofrece el encabezado completo como una sola `String`.

```
String signatureHeaderValue = cookies.signatureHeaderValue(); // "CloudFront-Signature=[SIGNATURE_VALUE]"
```

# Cambios en la API del creador de políticas de IAM de la versión 1 a la 2
<a name="migration-iam-policy-builder"></a>

En este tema se detallan los cambios en la API del creador de políticas de IAM de la versión 1 (v1) a la versión 2 (v2).

## Cambios de alto nivel
<a name="migration-iam-policy-builder-high-level"></a>


****  

| Cambio | v1 |   v2 | 
| --- | --- | --- | 
|    dependencias 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>  | 
| Nombre del paquete | com.amazonaws.auth.policy | software.amazon.awssdk.policybuilder.iam | 
| Nombres de clase |  [Política](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/policy/Policy.html) [Instrucción](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/es_es/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/es_es/sdk-for-java/latest/developer-guide/migration-iam-policy-builder.html)  | 

1 [Última versión](https://central.sonatype.com/artifact/com.amazonaws/aws-java-sdk-bom). 2 [Última versión](https://central.sonatype.com/artifact/software.amazon.awssdk/bom).

## Cambios en la API
<a name="migration-iam-policy-builder-api"></a>


****  

| Opción | v1 |   v2 | 
| --- | --- | --- | 
|  Crear una instancia de una política |  <pre>Policy policy = new Policy();</pre>  |  <pre>IamPolicy.Builder policyBuilder = IamPolicy.builder();<br />...<br />IamPolicy policy = policyBuilder.build();</pre>  | 
|    Establecer ID  |  <pre>policy.withtId(...);<br />policy.setId(...);</pre>  |  <pre>policyBuilder.id(...);</pre>  | 
|    Establecer versión  | N/A: usa la versión predeterminada de 2012-10-17 |  <pre>policyBuilder.version(...);</pre>  | 
|    Crear instrucción  |  <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>  | 
|    Establecer instrucción  |  <pre>policy.withStatements(statement);<br />policy.setStatements(statement);</pre>  |  <pre>policyBuilder.addStatement(statement);</pre>  | 

## Diferencias en la creación de una instrucción
<a name="migration-iam-policy-builder-statement"></a>

### Acciones
<a name="migration-iam-policy-builder-statement-actions"></a>

#### v1
<a name="migration-iam-policy-builder-statement-actions.v1"></a>

El SDK v1 tiene [tipos de `enum`](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/policy/Action.html) para acciones de servicio que representan elementos de `[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)` de una instrucción de política. A continuación, se muestran ejemplos de tipos de `enum`.
+ `[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)`

En el siguiente ejemplo se muestra la constante de `SendMessage` para `SQSActions`.

```
Action action = SQSActions.SendMessage;
```

No puede especificar un 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)` en una instrucción en v1.

####   v2
<a name="migration-iam-policy-builder-statement-actions.v2"></a>

En la versión 2, la [IamAction](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/policybuilder/iam/IamAction.html)interfaz representa todas las acciones. Para especificar un elemento de [acción específico del servicio](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_action.html), pase una cadena al método `create`, como se muestra en el código siguiente.

```
IamAction action = IamAction.create("sqs:SendMessage");
```

Puede especificar un `[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 una instrucción con v2 tal como se muestra en el siguiente código.

```
IamAction action = IamAction.create("sqs:SendMessage");
IamStatement.builder().addNotAction(action);
```

### Condiciones
<a name="migration-iam-policy-builder-statement-conditions"></a>

#### v1
<a name="migration-iam-policy-builder-statement-conditions-v1"></a>

Para representar las condiciones la instrucción, el SDK v1 usa subclases 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 subclase `Condition` define un tipo de comparación `enum` para ayudar a definir la condición. Por ejemplo, a continuación se muestra una [cadena de comparación](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String) *no como* para una condición.

```
Condition condition = new StringCondition(StringComparisonType.StringNotLike, "key", "value");
```

####   v2
<a name="migration-iam-policy-builder-statement-conditions-v2"></a>

En v2 se crea una condición para una instrucción de política utilizando `[IamCondition](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/policybuilder/iam/IamCondition.html)` y proporcionando un `[IamConditionOperator](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/policybuilder/iam/IamConditionOperator.html)`, que contiene `enums` para todos los 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>

El 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 una instrucción de política se representa mediante la clase `[Resource](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/policy/Resource.html)` del SDK. El ARN se proporciona como cadena en el constructor. Las siguientes subclases proporcionan constructores de conveniencia.
+ [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)
+ [SQSQueueResource](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/policy/resources/SQSQueueResource.html)

En v1 puede especificar un 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 un `[Resource](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/policy/Resource.html)` llamando al método `withIsNotType`, como se muestra en la siguiente instrucción.

```
Resource resource = new Resource("arn:aws:s3:::amzn-s3-demo-bucket").withIsNotType(true);
```

####   v2
<a name="migration-iam-policy-builder-statement-resources-v2"></a>

En v2 se crea un 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)` pasando un ARN al método `IamResource.create`.

```
IamResource resource = IamResource.create("arn:aws:s3:::amzn-s3-demo-bucket");
```

Se puede establecer un `[IamResource](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/policybuilder/iam/IamResource.html)` como 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)*, como se muestra en el siguiente fragmento de código.

```
IamResource resource = IamResource.create("arn:aws:s3:::amzn-s3-demo-bucket");
IamStatement.builder().addNotResource(resource);
```

`IamResource.ALL` representa todos los recursos. 

### Entidades principales
<a name="migration-iam-policy-builder-statement-principal"></a>

#### v1
<a name="migration-iam-policy-builder-statement-principal-v1"></a>

El SDK v1 ofrece las siguientes clases `[Principal](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/policy/Principal.html)` para representar los tipos de entidades principales que incluyen a todos los miembros:
+ `AllUsers`
+ `AllServices`
+ `AllWebProviders`
+ `All`

No se puede añadir un 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 una instrucción.

####   v2
<a name="migration-iam-policy-builder-statement-principal-v2"></a>

En v2, `IamPrincipal.ALL` representa todas las entidades principales:

Para representar a todos los miembros de otros tipos de entidades principales, utilice las clases `[IamPrincipalType](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/policybuilder/iam/IamPrincipalType.html)` al crear un `IamPrincipal`.
+ `IamPrincipal.create(IamPrincipalType.AWS,"*")` para todos los usuarios.
+ `IamPrincipal.create(IamPrincipalType.SERVICE,"*")` para todos los servicios.
+ `IamPrincipal.create(IamPrincipalType.FEDERATED,"*")` para todos los proveedores web.
+ `IamPrincipal.create(IamPrincipalType.CANONICAL_USER,"*")` para todos los usuarios canónicos.

Puede utilizar el método `addNotPrincipal` para representar un 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)` al crear una instrucción de política, como se muestra en la siguiente instrucción.

```
IamPrincipal principal = IamPrincipal.create(IamPrincipalType.AWS, "arn:aws:iam::444455556666:root");
IamStatement.builder().addNotPrincipal(principal);
```

# Cambios en el trabajo con DynamoDB de la versión 1 a la versión 2 del AWS SDK para Java
<a name="migration-ddb-mapper"></a>



**Topics**
+ [

# Diferencias de la API de mapeo de DynamoDB entre la versión 1 y la versión 2 del AWS SDK para Java
](ddb-mapping.md)
+ [

# Documente las diferencias de API entre la versión 1 y la versión 2 de AWS SDK para Java
](dynamodb-mapping-document-api.md)
+ [

# Migración de la biblioteca de cifrado
](ddb-encryption-lib-migrate.md)

# Diferencias de la API de mapeo de DynamoDB entre la versión 1 y la versión 2 del AWS SDK para Java
<a name="ddb-mapping"></a>

El APIs mapeo de DynamoDB cambió significativamente entre la versión 1 y la versión 2 de. AWS SDK para Java En la versión 1, se utiliza `DynamoDBMapper` para trabajar con Java. POJOs En la versión 2, se utiliza `DynamoDbEnhancedClient` con nombres de métodos actualizados, opciones de definición de esquemas mejoradas y seguridad de tipos mejorada.

Principales diferencias:
+ Nuevos nombres de métodos (por ejemplo, `getItem` en lugar de `load`)
+ Creación de esquemas de tabla explícitos
+ Compatibilidad integrada con operaciones sincrónicas y asincrónicas
+ Cambios en la forma en que se administran las cadenas vacías y la configuración

En esta sección, se describen los cambios en la API de asignación, las diferencias en las anotaciones, las actualizaciones de configuración y la guía de migración para ayudarte a realizar la transición de `DynamoDBMapper` v1 a `DynamoDbEnhancedClient` v2.

**Contents**
+ [

# Cambios de alto nivel en las bibliotecas asignación de la versión 1 a la 2 del SDK para Java
](dynamodb-mapping-high-level.md)
  + [

## Diferencias en dependencia de importación
](dynamodb-mapping-high-level.md#dynamodb-mapping-deps)
+ [

# Cambios en el APIs mapeo de DynamoDB entre la versión 1 y la versión 2 del SDK for Java
](dynamodb-mapping-api-changes.md)
  + [

## Crear un cliente
](dynamodb-mapping-api-changes.md#dynamodb-mapping-api-changes-client)
  + [

## Establecimiento de asignación a tabla/índice de DynamoDB
](dynamodb-mapping-api-changes.md#dynamodb-mapping-api-changes-mapping)
  + [

## Operaciones de tabla
](dynamodb-mapping-api-changes.md#dynamodb-mapping-api-changes-tobleops)
  + [

## Asignación de clases y propiedades
](dynamodb-mapping-api-changes.md#dynamodb-mapping-schemas)
    + [

### Anotaciones de bean
](dynamodb-mapping-api-changes.md#dynamodb-mapping-schemas-annos)
    + [

### Anotaciones adicionales de la V2
](dynamodb-mapping-api-changes.md#dynamodb-mapping-schemas-annos-v2-addnl)
  + [

## Configuración
](dynamodb-mapping-api-changes.md#dynamodb-mapping-configuration)
    + [

### Configuración por operación
](dynamodb-mapping-api-changes.md#dynamodb-mapping-configuration-per-op)
  + [

## Condicionales
](dynamodb-mapping-api-changes.md#dynamodb-mapping-conditionals)
  + [

## Conversión de tipos
](dynamodb-mapping-api-changes.md#dynamodb-mapping-type-conv)
    + [

### Convertidores predeterminados
](dynamodb-mapping-api-changes.md#dynamodb-mapping-type-conv-defaults)
    + [

### Establecimiento de un conversor personalizado para un atributo
](dynamodb-mapping-api-changes.md#dynamodb-mapping-type-conv-anno)
    + [

### Adición de una fábrica o un proveedor de convertidores de tipos
](dynamodb-mapping-api-changes.md#dynamodb-mapping-type-conv-factory)
+ [

# Diferencias en el tratamiento de cadenas entre la versión 1 y la 2 del SDK para Java
](dynamodb-migration-string-handling.md)
+ [

# Diferencias de bloqueo positivo entre la versión 1 y la 2 del SDK para Java
](dynamodb-migrate-optimstic-locking.md)
+ [

# Fluent setters: diferencias entre la versión 1 y la 2 del SDK para Java
](dynamodb-migrate-fluent-setters.md)

# Cambios de alto nivel en las bibliotecas asignación de la versión 1 a la 2 del SDK para Java
<a name="dynamodb-mapping-high-level"></a>

Los nombres del cliente de asignación de cada biblioteca difieren en la V1 y en la V2:
+ V1: Dynamo DBMapper
+ V2: Cliente mejorado de DynamoDB

Se interactúa con las dos bibliotecas prácticamente de la misma manera: se crea una instancia mapper/client y, a continuación, se proporciona un POJO de Java para leer y escribir estos APIs elementos en las tablas de DynamoDB. Ambas bibliotecas también ofrecen anotaciones para la clase del POJO para indicar la forma en que el cliente gestiona el POJO. 

Diferencias notables al pasar a V2:
+ V2 y V1 utilizan nombres de métodos diferentes para las operaciones de DynamoDB de bajo nivel. Por ejemplo:    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/sdk-for-java/latest/developer-guide/dynamodb-mapping-high-level.html)
+ La versión 2 ofrece varias formas de definir esquemas de tablas y asignarlos a tablas. POJOs Puede elegir entre el uso de anotaciones o un esquema generado a partir de código mediante un generador. V2 también ofrece versiones mutables e inmutables de los esquemas.
+ Con V2, se crea específicamente el esquema de tabla como uno de los primeros pasos, mientras que en V1, el esquema de tabla se deduce de la clase anotada según sea necesario.
+ V2 incluye el [Cliente de la API de documento](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/enhanced/dynamodb/document/EnhancedDocument.html) en la API de cliente mejorada, mientras que V1 usa una [API aparte](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/document/DynamoDB.html).
+ Todas APIs están disponibles en versiones síncronas y asíncronas en la versión 2.

Consulte la [sección de asignación de DynamoDB](dynamodb-enhanced-client.md) de esta guía para obtener información más detallada sobre el cliente mejorado de V2.

## Diferencias en dependencia de importación
<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 [Última versión](https://central.sonatype.com/artifact/software.amazon.awssdk/bom).

En la versión 1, una sola dependencia incluye tanto la API de DynamoDB de bajo nivel como mapping/document la API, mientras que en la versión 2, se utiliza `dynamodb-enhanced` la dependencia de artefactos para acceder a la API. mapping/document El módulo `dynamodb-enhanced` contiene una dependencia transitiva del módulo `dynamodb` de bajo nivel. 

# Cambios en el APIs mapeo de DynamoDB entre la versión 1 y la versión 2 del SDK for Java
<a name="dynamodb-mapping-api-changes"></a>

## Crear un cliente
<a name="dynamodb-mapping-api-changes-client"></a>


****  

| Caso de uso | V1 | V2 | 
| --- | --- | --- | 
|   Instanciación 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>  | 
|   Instanciación mínima  |  <pre>AmazonDynamoDB standardClient = AmazonDynamoDBClientBuilder.standard();<br />DynamoDBMapper mapper = new DynamoDBMapper(standardClient);</pre>  |  <pre>DynamoDbEnhancedClient enhancedClient = DynamoDbEnhancedClient.create();</pre>  | 
|   Con transformador de atributos\$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>  | 

\$1Las extensiones de V2 corresponden aproximadamente a los transformadores de atributos de V1. La sección [Uso de extensiones para personalizar operaciones de DynamoDB Enhanced Client](ddb-en-client-extensions.md) contiene más información sobre extensiones de V2. 

## Establecimiento de asignación a tabla/índice de DynamoDB
<a name="dynamodb-mapping-api-changes-mapping"></a>

En V1, se especifica un nombre de tabla de DynamoDB mediante una anotación de bean. En V2, un método de fábrica, `table()`, produce una instancia de `DynamoDbTable` que representa la tabla remota de DynamoDB. El primer parámetro del método `table()` es el nombre de tabla de DynamoDB.


****  

| Caso de uso | V1 | V2 | 
| --- | --- | --- | 
|   Asignar la clase POJO de Java a la tabla de 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>  | 
|   Asignar a un índice secundario de DynamoDB  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/sdk-for-java/latest/developer-guide/dynamodb-mapping-api-changes.html) En la sección de la Guía para desarrolladores de DynamoDB que analiza [el método de `query` V1](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBMapper.Methods.html#DynamoDBMapper.Methods.query) se muestra un ejemplo completo.  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/sdk-for-java/latest/developer-guide/dynamodb-mapping-api-changes.html) En la sección [Usar índices secundarios](ddb-en-client-use-secindex.md) de esta guía se proporciona más información.  | 

## Operaciones de tabla
<a name="dynamodb-mapping-api-changes-tobleops"></a>

En esta sección se describen las operaciones APIs que difieren entre la V1 y la V2 en la mayoría de los casos de uso estándar. 

En la V2, todas las operaciones que implican una sola tabla se llaman en la instancia de `DynamoDbTable`, no en el cliente mejorado. El cliente mejorado contiene métodos que pueden referirse a varias tablas. 

En la tabla denominada *Operaciones de tabla* que aparece a continuación, se hace referencia a una instancia de POJO como `item` o como tipo específico, por ejemplo `customer1`. En los ejemplos de la V2, la instancia llamada `table` es resultado de una llamada anterior a `enhancedClient.table()` que devuelve una referencia a la instancia `DynamoDbTable`.

Tenga en cuenta que la mayoría de las operaciones de la V2 se pueden llamar con un patrón de consumo fluido, incluso cuando no se muestran. Por ejemplo:

```
Customer customer = table.getItem(r → r.key(key));
  or
Customer customer = table.getItem(r → r.key(k -> k.partitionValue("id").sortValue("email")))
```

Para las operaciones de la V1, *Operaciones de tabla* (a continuación) contiene algunos de los formularios más utilizados y no todos los formularios sobrecargados. Por ejemplo, el método `load()` presenta las siguientes 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)
```

*Operaciones de tabla* (a continuación) muestra los formularios más utilizados:

```
mapper.load(item)
mapper.load(item, config)
```


**Operaciones de tabla**  

| Caso de uso | V1 | V2 | 
| --- | --- | --- | 
|  Escribir un POJO de Java en una tabla de DynamoDB **Operación de DynamoDB**: `PutItem`, `UpdateItem`  |  <pre>mapper.save(item)<br />mapper.save(item, config)<br />mapper.save(item, saveExpression, config)</pre> En la V1, `DynamoDBMapperConfig.SaveBehavior` y las anotaciones determinan a qué método de DynamoDB de bajo nivel se llamará. En general, se llama a `UpdateItem` excepto cuando se usa `SaveBehavior.CLOBBER` y `SaveBehavior.PUT`. Las claves generadas automáticamente son un caso de uso especial y, en ocasiones, se utilizan `PutItem` y `UpdateItem`.  |  <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>  | 
|  Leer un elemento de una tabla de DynamoDB a un POJO de Java **Operación de 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>  | 
|  Eliminar un elemento de una tabla de DynamoDB **Operación de DynamoDB:** `DeleteItem`  |  <pre>mapper.delete(item, deleteExpression, config)</pre>  |  <pre>table.deleteItem(deleteItemRequest)<br />table.deleteItem(item)<br />table.deleteItem(key)</pre>  | 
|  Consultar una tabla o un índice secundario de DynamoDB y devolución de una lista paginada **Operación de 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 el `PageIterable.stream()` devuelto (carga diferida) para respuestas sincrónicas y `PagePublisher.subscribe()` para respuestas asincrónicas  | 
|  Consultar una tabla o un índice secundario de DynamoDB y devolver una lista **Operación de 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 el `PageIterable.items()` devuelto (carga diferida) para respuestas sincrónicas y `PagePublisher.items.subscribe()` para respuestas asincrónicas  | 
|  Analizar una tabla o un índice secundario de DynamoDB y devolver una lista paginada **Operación de 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 el `PageIterable.stream()` devuelto (carga diferida) para respuestas sincrónicas y `PagePublisher.subscribe()` para respuestas asincrónicas  | 
|  Analizar una tabla o un índice secundario de DynamoDB y devolver una lista **Operación de 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 el `PageIterable.items()` devuelto (carga diferida) para respuestas sincrónicas y `PagePublisher.items.subscribe()` para respuestas asincrónicas  | 
|  Leer varios elementos de varias tablas de un lote **Operación de 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>  | 
|  Escribir varios elementos en varias tablas de un lote **Operación de 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>  | 
|  Eliminar varios elementos de varias tablas de un lote **Operación de 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>  | 
|  Escribir/eliminar varios elementos de un lote **Operación de 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>  | 
|  Realizar una escritura transaccional **Operación de DynamoDB:** `TransactWriteItems`  |  <pre>mapper.transactionWrite(transactionWriteRequest)</pre>  |  <pre>enhancedClient.transactWriteItems(transasctWriteItemsRequest)</pre>  | 
|  Realizar una lectura transaccional **Operación de DynamoDB:** `TransactGetItems`  |  <pre>mapper.transactionLoad(transactionLoadRequest)</pre>  |  <pre>enhancedClient.transactGetItems(transactGetItemsRequest) </pre>  | 
|  Obtener un recuento de elementos coincidentes de una consulta **Operación de DynamoDB:** `Query` con `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>  | 
|  Obtener un recuento de elementos coincidentes de un análisis **Operación de DynamoDB:** `Scan` con `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>  | 
|  Crear una tabla en DynamoDB correspondiente a la clase POJO **Operación de DynamoDB:** `CreateTable`  |  <pre>mapper.generateCreateTableRequest(Customer.class)</pre> La instrucción anterior genera una solicitud de creación de tabla de bajo nivel; los usuarios deben llamar a `createTable` en el cliente de 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>  | 
|  Realizar un análisis paralelo en DynamoDB **Operación de DynamoDB**: `Scan` con parámetros`Segment` y `TotalSegments`  |  <pre>mapper.parallelScan(Customer.class, <br />                    scanExpression, <br />                    numTotalSegments)</pre>  |  Los usuarios deben administrar los subprocesos de trabajo y llamar a `scan` para cada segmento: <pre>table.scan(r -> r.segment(0).totalSegments(5))</pre>  | 
|  Integración de Amazon S3 con DynamoDB para almacenar enlaces de S3 inteligentes  |  <pre>mapper.createS3Link(bucket, key)<br />mapper.getS3ClientCache()</pre>  |  No se admite porque acopla Amazon S3 y DynamoDB.  | 

## Asignación de clases y propiedades
<a name="dynamodb-mapping-schemas"></a>

Tanto en la V1 como en la V2, las clases se asignan a tablas mediante anotaciones de tipo bean. La V2 también ofrece [otras formas de definir esquemas](ddb-en-client-adv-features.md#ddb-en-client-adv-features-schm-overview) para casos de uso específicos, como trabajar con clases inmutables.

### Anotaciones de bean
<a name="dynamodb-mapping-schemas-annos"></a>

La siguiente tabla muestra las anotaciones de bean equivalentes para un caso de uso específico que se utilizan en V1 y V2. Se utiliza un escenario de clase de `Customer` para ilustrar parámetros.

Las anotaciones, así como las clases y las enumeraciones, de la versión 2 siguen la convención camel case y utilizan '', no 'DynamoDB'. DynamoDb


| Caso de uso | V1 | V2 | 
| --- | --- | --- | 
| Asignar clase a tabla |  <pre>@DynamoDBTable (tableName ="CustomerTable")</pre>  | <pre>@DynamoDbBean<br />@DynamoDbBean(converterProviders = {...})</pre>El nombre de la tabla se define al llamar al método DynamoDbEnhancedClient\$1table(). | 
| Designar un miembro de clase como atributo de tabla  |  <pre>@DynamoDBAttribute(attributeName = "customerName")</pre>  |  <pre>@DynamoDbAttribute("customerName") </pre>  | 
| Designar a un hash/partition miembro de la clase es clave |  <pre>@DynamoDBHashKey </pre>  |  <pre>@DynamoDbPartitionKey</pre>  | 
| Designar a un miembro de la clase es range/sort clave |  <pre>@DynamoDBRangeKey </pre>  |  <pre>@DynamoDbSortKey </pre>  | 
| Designar un miembro de clase como clave de hash/partición de índice secundario |  <pre>@DynamoDBIndexHashKey </pre>  |  <pre>@DynamoDbSecondaryPartitionKey </pre>  | 
| Designar un miembro de clase como clave de rango/clasificación de índice secundario |  <pre>@DynamoDBIndexRangeKey </pre>  |  <pre>@DynamoDbSecondarySortKey </pre>  | 
| Ignorar este miembro de clase al asignarlo a una tabla |  <pre>@DynamoDBIgnore </pre>  |  <pre>@DynamoDbIgnore</pre>  | 
| Designar un miembro de clase como atributo clave UUID generado automáticamente |  <pre>@DynamoDBAutoGeneratedKey</pre>  |  <pre>@DynamoDbAutoGeneratedUuid </pre> La extensión que lo proporciona no se carga de forma predeterminada; debe agregarla al compilador de clientes.  | 
| Designar un miembro de clase como atributo de marca de tiempo generado automáticamente |  <pre>@DynamoDBAutoGeneratedTimestamp</pre>  |  <pre>@DynamoDbAutoGeneratedTimestampAttribute</pre> La extensión que lo proporciona no se carga de forma predeterminada; debe agregarla al compilador de clientes.  | 
| Designar un miembro de clase como atributo de versión con incremento automático |  <pre>@DynamoDBVersionAttribute</pre>  |  <pre>@DynamoDbVersionAttribute</pre> La extensión que proporciona esto se carga automáticamente.  | 
| Designar que un miembro de clase requiere una conversión personalizada |  <pre>@DynamoDBTypeConverted</pre>  |  <pre>@DynamoDbConvertedBy</pre>  | 
| Designar que un miembro de clase se almacene como otro tipo de atributo |  <pre>@DynamoDBTyped(<DynamoDBAttributeType>)</pre>  |  Utilice una implementación de `AttributeConverter`. V2 proporciona muchos convertidores integrados para tipos de Java comunes. También puede implementar su propio `AttributeConverter` o `AttributeConverterProvider` personalizado. Consulte [Conversión de atributos de control](ddb-en-client-adv-features-conversion.md) en esta guía.  | 
| Designe una clase que se pueda serializar en un documento (documento de estilo JSON) o subdocumento de DynamoDB  |  <pre>@DynamoDBDocument</pre>  | Uso de la API de Documento mejorado Consulte los siguientes recursos:[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/sdk-for-java/latest/developer-guide/dynamodb-mapping-api-changes.html) | 

### Anotaciones adicionales de la V2
<a name="dynamodb-mapping-schemas-annos-v2-addnl"></a>


| Caso de uso | V1 | V2 | 
| --- | --- | --- | 
| Designar que un miembro de clase no se almacene como atributo NULL si el valor de Java es nulo | N/A |  <pre>@DynamoDbIgnoreNulls</pre>  | 
| Designar un miembro de clase como objeto vacío si todos los atributos son nulos | N/A |  <pre>@DynamoDbPreserveEmptyObject</pre>  | 
| Designar una acción de actualización especial para un miembro de clase | N/A |  <pre>@DynamoDbUpdateBehavior</pre>  | 
| Designar una clase inmutable | N/A |  <pre>@DynamoDbImmutable</pre>  | 
| Designar un miembro de clase como atributo de contador de incremento automático | N/A |  <pre>@DynamoDbAtomicCounter</pre> La extensión que proporciona esto se carga automáticamente.  | 

## Configuración
<a name="dynamodb-mapping-configuration"></a>

En la V1, generalmente se controlan comportamientos específicos mediante una instancia de `DynamoDBMapperConfig`. Puede proporcionar el objeto de configuración al crear el asignador o al realizar una solicitud. En la V2, la configuración es específica del objeto de solicitud de la operación.


| Caso de uso | V1 | Predeterminado en V1 | V2 | 
| --- | --- | --- | --- | 
|  |  <pre>DynamoDBMapperConfig.builder()</pre>  |  |  | 
| Estrategia de load/write reintento por lotes |  <pre>  .withBatchLoadRetryStrategy(loadRetryStrategy)</pre> <pre>  .withBatchWriteRetryStrategy(writeRetryStrategy)</pre>  | reintento de elementos fallidos | Configure la estrategia de reintento en el DynamoDBClient subyacente. Consulte [Configure el comportamiento de reintento en el AWS SDK for Java 2.x](retry-strategy.md) en esta guía. | 
| Lecturas consistentes |  <pre>  .withConsistentReads(CONSISTENT)</pre>  | EVENTUAL | De forma predeterminada, las lecturas consistentes son falsas para operaciones de lectura. Anule con .consistentRead(true) en el objeto de solicitud. | 
| Esquema de conversión con conjuntos de serializadores/deserializadores |  <pre>  .withConversionSchema(conversionSchema)</pre> Las implementaciones estáticas proporcionan compatibilidad con versiones anteriores.  | V2\$1COMPATIBLE | No se usa. Se trata de una función antigua que hace referencia a la forma en que las primeras versiones de DynamoDB (V1) almacenaban los tipos de datos, y este comportamiento no se conservará en el cliente mejorado. Un ejemplo de comportamiento en DynamoDB V1 es almacenar los valores booleanos como número en lugar de como booleanos. | 
| Nombres de tablas |  <pre>  .withObjectTableNameResolver()<br />  .withTableNameOverride() <br />  .withTableNameResolver()</pre> Las implementaciones estáticas proporcionan compatibilidad con versiones anteriores  | usa anotación o estimación a partir de la clase |  El nombre de la tabla se define al llamar al método `DynamoDbEnhancedClient#table()`.  | 
| Estrategia de carga de paginación |  <pre>  .withPaginationLoadingStrategy(strategy)</pre>  Las opciones son: LAZY\$1, `LOADING`, `EAGER_LOADING` o `ITERATION_ONLY`  | LAZY\$1LOADING |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/sdk-for-java/latest/developer-guide/dynamodb-mapping-api-changes.html)  | 
| Solicitud de recopilación de métricas |  <pre>  .withRequestMetricCollector(collector)</pre>  | null | Use metricPublisher() en ClientOverrideConfiguration al crear el cliente estándar de DynamoDB.  | 
| Comportamiento de guardado |  <pre>  .withSaveBehavior(SaveBehavior.CLOBBER) </pre> Las opciones son `UPDATE`, `CLOBBER`, `PUT`, `APPEND_SET` o `UPDATE_SKIP_NULL_ATTRIBUTES`.  | UPDATE |  En la V2, se llama a `putItem()` o `updateItem()` de forma explícita. `CLOBBER or PUT`: la acción correspondiente en la v2 es llamar a `putItem()`. No hay una configuración específica de `CLOBBER`. `UPDATE`: Corresponde a `updateItem()` `UPDATE_SKIP_NULL_ATTRIBUTES`: Corresponde a`updateItem()`. Controle el comportamiento de actualización con la configuración de solicitud `ignoreNulls` y la anotación/etiqueta `DynamoDbUpdateBehavior`. `APPEND_SET`: no se admite  | 
| Fábrica de convertidores de tipos |  <pre>  .withTypeConverterFactory(typeConverterFactory) </pre>  | convertidores de tipos estándar |  Establezca el bean utilizando <pre>@DynamoDbBean(converterProviders = {ConverterProvider.class, <br />        DefaultAttributeConverterProvider.class})</pre>  | 

### Configuración por operación
<a name="dynamodb-mapping-configuration-per-op"></a>

En la V1, algunas operaciones, por ejemplo, `query()`, son altamente configurables mediante un objeto de “expresión” enviado a la operación. Por ejemplo:

```
DynamoDBQueryExpression<Customer> emailBwQueryExpr = new DynamoDBQueryExpression<Customer>()
    .withRangeKeyCondition("Email",
        new Condition()
            .withComparisonOperator(ComparisonOperator.BEGINS_WITH)
            .withAttributeValueList(
                new AttributeValue().withS("my")));

mapper.query(Customer.class, emailBwQueryExpr);
```

En la V2, en lugar de utilizar un objeto de configuración, se establecen parámetros en el objeto de solicitud mediante un generador. Por ejemplo:

```
QueryEnhancedRequest emailBw = QueryEnhancedRequest.builder()
    .queryConditional(QueryConditional
        .sortBeginsWith(kb -> kb
            .sortValue("my"))).build();

customerTable.query(emailBw);
```

## Condicionales
<a name="dynamodb-mapping-conditionals"></a>

En la V2, las expresiones condicionales y de filtrado se expresan mediante un objeto `Expression`, que encapsula la condición y la asignación de nombres y filtros. 


| Caso de uso | Operaciones | V1 | V2 | 
| --- | --- | --- | --- | 
| Condiciones 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; utilice ConditionExpression en su lugar. | 
| Expresión de condición | 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>  | 
| Expresión 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>  | 
| Expresión de condición 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>  | 

## Conversión de tipos
<a name="dynamodb-mapping-type-conv"></a>

### Convertidores predeterminados
<a name="dynamodb-mapping-type-conv-defaults"></a>

En la V2, el SDK proporciona un conjunto de convertidores predeterminados para todos los tipos comunes. Puede cambiar los convertidores de tipos tanto en el nivel de proveedor general como para un único atributo. Puedes encontrar una lista de los convertidores disponibles en la referencia de la [AttributeConverter](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/enhanced/dynamodb/AttributeConverter.html)API.

### Establecimiento de un conversor personalizado para un atributo
<a name="dynamodb-mapping-type-conv-anno"></a>

En la V1, puede anotar un método getter con `@DynamoDBTypeConverted` para especificar la clase que convierte entre el tipo de atributo de Java y un tipo de atributo de DynamoDB. Por ejemplo, se puede aplicar un `CurrencyFormatConverter` que convierta entre un tipo `Currency` de Java y una cadena de DynamoDB, como se muestra en el siguiente fragmento de código.

```
@DynamoDBTypeConverted(converter = CurrencyFormatConverter.class)
public Currency getCurrency() { return currency; }
```

A continuación se muestra el equivalente en V2 del fragmento anterior.

```
@DynamoDbConvertedBy(CurrencyFormatConverter.class)
public Currency getCurrency() { return currency; }
```

**nota**  
En la V1 puede aplicar la anotación al atributo en sí, a un tipo o a una anotación definida por el usuario, mientras que en la V2 solo se puede aplicar la anotación al getter.

### Adición de una fábrica o un proveedor de convertidores de tipos
<a name="dynamodb-mapping-type-conv-factory"></a>

En la V1 puede proporcionar su propio conjunto de convertidores de tipos o anular los tipos que le interesen añadiendo una fábrica de convertidores de tipos a la configuración. La fábrica de convertidores de tipos amplía `DynamoDBTypeConverterFactory` y las anulaciones se realizan tomando una referencia al conjunto predeterminado y ampliándola. En el siguiente fragmento de código se muestra cómo hacerlo.

```
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);
```

La V2 proporciona una funcionalidad similar a través de la anotación `@DynamoDbBean`. Puede proporcionar un `AttributeConverterProvider` único o una cadena de `AttributeConverterProvider` en orden. Tenga en cuenta que si suministra su propia cadena de proveedores de convertidores de atributos, anulará el proveedor de convertidores predeterminado y deberá incluirlo en la cadena para utilizar sus convertidores de atributos. 

```
@DynamoDbBean(converterProviders = {
   ConverterProvider1.class, 
   ConverterProvider2.class,
   DefaultAttributeConverterProvider.class})
public class Customer {
  ...
}
```

La sección sobre [conversión de atributos](ddb-en-client-adv-features-conversion.md#ddb-en-client-adv-features-conversion-example) de esta guía contiene un ejemplo completo para la V2.

# Diferencias en el tratamiento de cadenas entre la versión 1 y la 2 del SDK para Java
<a name="dynamodb-migration-string-handling"></a>

La V1 y la V2 tratan las cadenas vacías de forma diferente al enviar datos a DynamoDB:
+ **V1**: convierte las cadenas vacías en valores nulos antes de enviarlas a DynamoDB (lo que no produce ningún atributo)
+ **V2**: envía cadenas vacías como valores reales de cadenas vacías a DynamoDB

**importante**  
Tras migrar a la V2, si no desea almacenar cadenas vacías en DynamoDB, debe implementar convertidores personalizados. Sin convertidores personalizados, la V2 almacena cadenas vacías como atributos de cadenas vacías reales en los elementos de DynamoDB, lo que difiere del comportamiento de la V1, que omite estos atributos por completo.

**Example conversor personalizado para la V2 que convierte un atributo de cadena vacía en 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;
    }
}
```



# Diferencias de bloqueo positivo entre la versión 1 y la 2 del SDK para Java
<a name="dynamodb-migrate-optimstic-locking"></a>

Tanto la V1 como la V2 implementan bloqueo positivo con una anotación de atributo que marca una propiedad en la clase bean para almacenar el número de versión.


**Diferencias en el comportamiento de bloqueo positivo**  

|  | V1 | V2 | 
| --- | --- | --- | 
| Anotación de clase bean | @DynamoDBVersionAttribute | @DynamoDbVersionAttribute (tenga en cuenta que la V2 usa una “b” minúscula) | 
| Guardado inicial | Atributo de número de versión establecido en 1. |  Valor inicial del atributo de versión establecido en `@DynamoDbVersionAttribute(startAt = X)`. El valor predeterminado es 0.  | 
| Actualización | El atributo de número de versión se incrementa en 1 si la comprobación condicional verifica que el número de versión del objeto que se está actualizando coincide con el número de la base de datos. |  El atributo de número de versión se incrementa si la comprobación condicional verifica que el número de versión del objeto que se está actualizando coincide con el número de la base de datos. El atributo de número de versión se incrementa mediante la opción `incrementBy` establecida en `@DynamoDbVersionAttribute(incrementBy = X)`. El valor predeterminado es 1.  | 
| Eliminar | DynamoDBMapper añade una comprobación condicional de que el número de versión del objeto que se está eliminando coincide con el número de versión de la base de datos. |  La V2 no añade automáticamente condiciones para las operaciones de eliminación. Debe añadir expresiones de condición manualmente si desea controlar el comportamiento de eliminación. En el siguiente ejemplo, `recordVersion` es el atributo de versión del 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>  | 
| Escritura transaccional con comprobación de condición | No se puede utilizar una clase de bean que esté anotada con @DynamoDBVersionAttribute en un método addConditionCheck. | Puede utilizar una clase de bean con la anotación @DynamoDbVersionAttribute en un método de compilador addConditionCheck para una solicitud transactWriteItems. | 
| Deshabilitado | Para deshabilitar el bloqueo positivo, cambie el valor de enumeración  DynamoDBMapperConfig.SaveBehavior de UPDATE a CLOBBER. |  No utilice la anotación `@DynamoDbVersionAttribute`.  | 

# Fluent setters: diferencias entre la versión 1 y la 2 del SDK para Java
<a name="dynamodb-migrate-fluent-setters"></a>

Se puede usar POJOs con configuradores fluidos en la API de mapeo de DynamoDB para la versión 1 y con la V2 desde la versión 2.30.29. 

Por ejemplo, el siguiente POJO devuelve una instancia `Customer` del 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;
  }
}
```

Sin embargo, si utiliza una versión de V2 anterior a la 2.30.29, `setName` devuelve una instancia `Customer` con un 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 las diferencias de API entre la versión 1 y la versión 2 de AWS SDK para Java
<a name="dynamodb-mapping-document-api"></a>

La API de documentos permite trabajar con documentos de estilo JSON como elementos individuales en una tabla de DynamoDB. La API de documentos de la V1 tiene una API correspondiente en la V2, pero en lugar de utilizar un cliente independiente para la API de documentos como en la V1, la V2 incorpora características de la API de documentos en el cliente mejorado de DynamoDB. 

En la V1, la clase [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 un registro no estructurado de una tabla de DynamoDB. En la V2, un registro no estructurado se representa mediante una instancia de la clase [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). Tenga en cuenta que las claves principales se definen en el esquema de tabla en la V2 y en el propio elemento en la V1.

En la siguiente tabla se comparan las diferencias entre el documento APIs en la V1 y la V2.


| Caso de uso | V1 | V2 | 
| --- |--- |--- |
| Cree un 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>  | 
| Haga referencia a una tabla |  <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** | 
| --- |
| Poner elemento |  <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>  | 
| Obtener elemento |  <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** | 
| --- |
| Convierte una estructura JSON para usarla con la API de documentos |  <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>  | 
| Pon JSON |  <pre>documentTable.putItem(item)</pre>  |  <pre>documentTable.putItem(document);</pre>  | 
| Lee 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>  | 

## Referencia de API y guías para el documento APIs
<a name="dynamodb-mapping-document-api-ref"></a>


|  | V1 | V2 | 
| --- | --- | --- | 
| Referencia de la API | [Referencia de la API](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/document/package-summary.html) | [Referencia de la API](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/enhanced/dynamodb/document/package-summary.html) | 
| Guía de documentación | [Guía para desarrolladores de Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/JavaDocumentAPIItemCRUD.html) | [API de documentos mejorada](ddb-en-client-doc-api.md) (esta guía) | 

# De la API Xpec de la V1 a la API Expresiones de la V2
<a name="ddb-v1-xspec-migrate"></a>

La API de especificación de expresiones (Xspec) disponible en la V1, que ayuda a crear expresiones para trabajar con datos orientados a documentos, no está disponible en la V2. La versión 2 usa la API Expression, que funciona tanto con datos orientados a documentos como con datos object-to-item mapeados.


****  

|  | V1 | V2 | 
| --- | --- | --- | 
| Nombre de API | API de especificación de expresiones (Xspec) | API de expresiones | 
| Funciona con | Métodos de la clase [Tabla](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/document/Table.html) de la API 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-) y [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 de DynamoDB Enhanced Client: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/sdk-for-java/latest/developer-guide/ddb-v1-xspec-migrate.html) Para ambos tipos de APIs, después de haber adquirido una [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)instancia: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/sdk-for-java/latest/developer-guide/ddb-v1-xspec-migrate.html) utilice expresiones en métodos `DynamoDbTable` cuando cree objetos de solicitud. Por ejemplo, en el método `filterExpression` del [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/es_es/sdk-for-java/latest/developer-guide/ddb-v1-xspec-migrate.html)  | [Información sobre expresiones](ddb-en-client-expressions.md) en esta Guía para desarrolladores de Java | 

# Migración de la biblioteca de cifrado
<a name="ddb-encryption-lib-migrate"></a>

Para obtener información sobre la migración de la biblioteca de cifrado para que DynamoDB funcione con la versión 2 del SDK de Java, consulte la [Guía para desarrolladores de Cliente de encriptación de Amazon DynamoDB](https://docs.aws.amazon.com/database-encryption-sdk/latest/devguide/ddb-java-migrate.html).

# Cambios en el procesamiento automático de solicitudes por lotes de Amazon SQS de la versión 1 a la 2
<a name="migration-sqs-auto-batching"></a>

En este tema se detallan los cambios en el procesamiento automático de solicitudes por lotes para Amazon SQS entre la versión 1 y la 2 de AWS SDK para Java.

## Cambios de alto nivel
<a name="migration-sqs-auto-batching-high-level-changes"></a>

La versión AWS SDK para Java 1.x realiza el almacenamiento en búfer del lado del cliente mediante una `[AmazonSQSBufferedAsyncClient](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/sqs/buffered/AmazonSQSBufferedAsyncClient.html)` clase independiente que requiere una inicialización explícita para el procesamiento por lotes de solicitudes. 

Esto AWS SDK for Java 2.x simplifica y mejora la funcionalidad de almacenamiento en búfer con. `[SqsAsyncBatchManager](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/sqs/batchmanager/SqsAsyncBatchManager.html)` La implementación de esta interfaz proporciona capacidades automáticas de procesamiento de solicitudes por lotes integradas directamente con el `[SqsAsyncClient](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/sqs/SqsAsyncClient.html)` estándar. Para obtener más información sobre el `SqsAsyncBatchManager` de la v2, consulte el tema [Utilice el procesamiento automático por lotes de solicitudes para Amazon SQS con AWS SDK for Java 2.x](sqs-auto-batch.md) de esta guía.


| Cambio | v1 |   v2 | 
| --- | --- | --- | 
|    dependencias 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>  | 
| Nombres de paquetes | com.amazonaws.services.sqs.buffered | software.amazon.awssdk.services.sqs.batchmanager | 
| Nombres de clase |  `[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 [Última versión](https://central.sonatype.com/artifact/com.amazonaws/aws-java-sdk-bom). 2 [Última versión](https://central.sonatype.com/artifact/software.amazon.awssdk/bom).

## Uso del procesamiento automático de solicitudes por lotes de SQS
<a name="migration-sqs-auto-batching-using"></a>


| Cambio | v1 |   v2 | 
| --- | --- | --- | 
| Creación de un administrador 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>  | 
| Creación de un administrador de lotes con configuración 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>  | 
| Envío de mensajes |  <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>  | 
| Cómo eliminar mensajes |  <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>  | 
| Cambio de visibilidad de los mensajes |  <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>  | 
| Recepción de mensajes |  <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>  | 

## Diferencias entre tipos de devolución asincrónica
<a name="migration-sqs-auto-batching-asyc-return-type"></a>


| Cambio | v1 |   v2 | 
| --- | --- | --- | 
| Tipo de devolución | Future<ResultType> | CompletableFuture<ResponseType> | 
| Mecanismo de devolución de llamada | Requiere un AsyncHandler con métodos onSuccess y onError separados | Usos CompletableFuture APIs proporcionados por el JDK, como,, whenComplete() thenCompose() thenApply() | 
| Tratamiento de excepciones | Utiliza el método AsyncHandler\$1onError() | Usos CompletableFuture APIs proporcionados por el JDK, comoexceptionally(), handle() o whenComplete() | 
| Cancelación | Compatibilidad básica a través de Future.cancel() | Al cancelar un CompletableFuture principal se cancelan automáticamente todos los futuros dependientes de la cadena | 

## Diferencias en el tratamiento de finalización asincrónica
<a name="migration-sqs-auto-batching-asyc-completion-handling"></a>


| Cambio | v1 |   v2 | 
| --- | --- | --- | 
| Implementación del controlador de respuestas |  <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>  | 

## Parámetros principales de configuración
<a name="migration-sqs-auto-batching-params"></a>


****  

| Parámetro | v1 |   v2 | 
| --- | --- | --- | 
| Tamaño máximo de lote | maxBatchSize (de forma predeterminada, 10 solicitudes por lote) | maxBatchSize (de forma predeterminada, 10 solicitudes por lote) | 
| Tiempo de espera por lotes | maxBatchOpenMs (de forma predeterminada, 200 ms) | sendRequestFrequency (de forma predeterminada, 200 ms) | 
| Tiempo de espera de visibilidad | visibilityTimeoutSeconds (-1 para cola de forma predeterminada) | receiveMessageVisibilityTimeout (cola de forma predeterminada) | 
| Tiempo de espera mínimo | longPollWaitTimeoutSeconds (20 s cuando longPoll es True) | receiveMessageMinWaitDuration (de forma predeterminada, 50 ms) | 
| Atributos de mensajes | Configure usando ReceiveMessageRequest | receiveMessageAttributeNames(ninguno de forma predeterminada) | 
| Atributos del sistema | Configure usando ReceiveMessageRequest | receiveMessageSystemAttributeNames(ninguno de forma predeterminada) | 
| Sondeo largo | longPoll (el valor predeterminado es True) | No se admite para evitar que las conexiones abiertas esperen hasta que el servidor envíe los mensajes | 
| Tiempo de espera máximo para sondeos prolongados | longPollWaitTimeoutSeconds (de forma predeterminada, 20 s) | No se admite para evitar que las conexiones abiertas esperen hasta que el servidor envíe los mensajes | 
| Número máximo de lotes de recepción de captura previa almacenados en el cliente | maxDoneReceiveBatches (10 lotes) | No se admite porque se trata internamente | 
| Número máximo de lotes de salida activos procesados de forma simultánea | maxInflightOutboundBatches (de forma predeterminada, 5 lotes) | No se admite porque se trata internamente | 
| Número máximo de lotes de recepción activos procesados de forma simultánea | maxInflightReceiveBatches (de forma predeterminada, 10 lotes) | No se admite porque se trata internamente | 

# Utilizar el SDK para Java 1.x y 2.x en paralelo
<a name="migration-side-by-side"></a>

Puede utilizar ambas versiones de AWS SDK para Java en sus proyectos.

A continuación, se muestra un ejemplo del archivo `pom.xml` para un proyecto que utiliza Amazon S3 de la versión 1.11.x y DynamoDB de la versión 2.27.21.

**Example Ejemplo de POM**  
En este ejemplo se muestra una entrada de archivo `pom.xml` para un proyecto que utiliza las versiones 1.x y 2.x del 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>
```