

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

# Migrare dalla versione 1.x alla 2.x del AWS SDK per Java
<a name="migration"></a>

La AWS SDK per Java 2.x è un'importante riscrittura della base di codice 1.x basata su Java 8\$1. Include numerosi aggiornamenti, tra cui maggiore consistenza, semplicità d'uso e immutabilità rigorosamente applicata. Questa sezione descrive le principali funzionalità nuove della versione 2.x e fornisce indicazioni su come migrare il codice alla versione 2.x dalla 1.x.

**Topics**
+ [Novità della versione 2](#migration-whats-new)
+ [Trova applicazioni utilizzando i client 1.x](migration-find-apps-using-v1.md)
+ [Come migrare](migration-howto.md)
+ [Cosa c'è di diverso tra 1.x e 2.x](migration-whats-different.md)
+ [Usa l'SDK per Java 1.x e 2.x side-by-side](migration-side-by-side.md)

## Novità della versione 2
<a name="migration-whats-new"></a>
+ È possibile configurare i propri client HTTP. [Vedi Configurazione del trasporto HTTP.](http-configuration.md)
+ I client asincroni offrono I/O supporto non bloccante e oggetti di ritorno. `CompletableFuture` [Vedi Programmazione asincrona.](asynchronous.md)
+ Le operazioni che restituiscono più pagine dispongono di risposte con paginazione automatica. In questo modo, puoi concentrare il codice su cosa fare con la risposta, senza dover controllare e visualizzare le pagine successive. Vedi [Paginazione.](pagination.md) 
+ Le prestazioni dell'SDK all'avvio delle AWS Lambda funzioni sono migliorate. Vedi i miglioramenti delle [prestazioni dell'ora di avvio dell'SDK](lambda-optimize-starttime.md). 
+ La versione 2.x supporta un nuovo metodo breve per la creazione delle richieste.  
**Example**  

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

Per maggiori dettagli sulle nuove funzionalità e per vedere esempi di codice specifici, consulta le altre sezioni di questa guida.
+  [Quick Start](get-started.md) 
+  [Configurazione](setup.md) 
+  [Esempi di codice per la versione AWS SDK per Java 2.x](java_code_examples.md)
+  [Usa l'SDK](using.md) 
+  [Sicurezza per AWS SDK per Java](security.md) 

# Trova applicazioni utilizzando i AWS SDK per Java client 1.x
<a name="migration-find-apps-using-v1"></a>

Prima di effettuare la migrazione a AWS SDK for Java 2.x, è necessario identificare quali applicazioni nel proprio ambiente utilizzano i client SDK for Java 1.x. È possibile utilizzare CloudTrail i log per tracciare l'utilizzo dell'SDK, cercare nei log delle applicazioni avvisi di obsolescenza, ispezionare il codice sorgente e creare configurazioni o esaminare gli artefatti Java distribuibili. Utilizzate i metodi disponibili nel vostro ambiente.

## Usa CloudTrail Lake per trovare applicazioni con client 1.x
<a name="migration-find-v1-apps-with-cloudtrail"></a>

AWS CloudTrail Lake ti consente di interrogare gli eventi registrati da CloudTrail. Segui questi passaggi per creare un data lake che identifichi le versioni SDK utilizzate dalle tue applicazioni:

1. Crea un CloudTrail data lake. Consulta la [Guida per l'utente](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/query-event-data-store.html) per creare un data store di eventi.

1. Dopo aver creato il data store, esaminate il contenuto del record. Il corpo del record contiene campi che determinano l'azione, la tempistica e la posizione richieste. Per i dettagli, consulta la [Guida per l'utente per i contenuti dei CloudTrail record](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-event-reference-record-contents.html).

1. Esegui interrogazioni sui tuoi dati. Segui la [Guida per l'utente per interrogare e salvare i risultati delle query](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/query-run-query.html).

Il campo *UserAgent* in ogni record contiene la versione SDK che ha effettuato la richiesta. Utilizzate questo campo per identificare le applicazioni che utilizzano SDK for Java 1.x.

La seguente query di esempio trova tutte le richieste di ID da applicazioni utente e strumenti di terze parti realizzate con SDK for Java 1.x a partire dal 17 giugno 2025: EventDatastore `sample-Data-Store-Id`

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

Un esempio di contenuto dell'evento nel risultato della query è simile al seguente:

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

È possibile utilizzare queste informazioni per determinare quando e dove è stata effettuata la richiesta.

Nell'esempio, è stata effettuata una richiesta `ListTables` DynamoDB `2025-07-01 02:23:52 (UTC)` all'`12.345.6.78`indirizzo IP con le credenziali dell'utente IAM di nome Alice. Il valore del campo *UserAgent* indica che la richiesta è stata effettuata utilizzando la AWS SDK per Java versione di un sistema Linux con `1.12.746` JDK 11.

Per una descrizione dei campi del record degli AWS CloudTrail eventi, consulta il [contenuto dei CloudTrail record per gli eventi di gestione, dati e attività di rete](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-event-reference-record-contents.html).

Se non CloudTrail è abilitato nel tuo account, contatta l'amministratore dell' AWS account dell'organizzazione per abilitarlo oppure utilizza uno dei metodi alternativi descritti nelle sezioni seguenti.

CloudTrail Lake addebita i costi per i dati acquisiti e i dati scansionati per ogni query. Per ridurre al minimo i costi, filtra le query in base a intervalli di tempo e aree geografiche specifici. Per i prezzi correnti, consulta [Prezzi di AWS CloudTrail](https://aws.amazon.com/cloudtrail/pricing/).

## Cerca nei log a livello di avviso delle applicazioni la deprecazione dell'SDK
<a name="migration-find-v1-apps-log-warning"></a>

A partire dalla versione 1.12.767 (rilasciata il 30 luglio 2024), la versione 1.x emette un avviso di obsolescenza all'avvio dell'applicazione. AWS SDK per Java È possibile cercare questo avviso nei registri delle applicazioni per identificare quali applicazioni e host utilizzano SDK for Java 1.x.

L'esatta formulazione dell'avviso dipende dalla versione dell'SDK:
+ Versioni da 1.12.767 a 1.12.796:

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

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

La fine `...` indica che il messaggio di avviso continua con testo aggiuntivo. È possibile cercare il prefisso comune per `The AWS SDK for Java 1.x` trovare una delle due versioni dell'avviso.

L'esempio seguente mostra la ricerca di questo avviso utilizzando: `grep`

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

Se viene trovato l'avviso, il `grep` comando stampa le righe di registro corrispondenti. Se non viene trovato alcun avviso, l'applicazione non utilizza SDK for Java 1.x o utilizza una versione precedente alla 1.12.767. In tal caso, utilizzate uno degli altri metodi descritti in questo documento.

## Cerca nel codice sorgente e nelle dipendenze
<a name="migration-find-v1-apps-source-code"></a>

Puoi cercare nella tua codebase e creare file di configurazione per trovare riferimenti alla AWS SDK per Java versione 1.x. L'identificatore chiave è l'ID del `com.amazonaws` gruppo, utilizzato da tutti gli artefatti SDK for Java 1.x.

Gli esempi seguenti ne illustrano l'utilizzo `grep` per la ricerca di `com.amazonaws` riferimenti nei comuni file di progetto Java.

**Esempio: ricerca nei file sorgente Java per le importazioni SDK for Java 1.x (eseguite dalla directory principale del progetto)**

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

Output di esempio:

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

**Nota**  
Il `com.amazonaws` pacchetto viene utilizzato anche da librerie che non fanno parte dell'SDK for Java 1.x, come. `aws-lambda-java-core` Per confermare che un'importazione proviene da SDK for Java 1.x, verifica che l'ID dell'artefatto corrispondente nella configurazione o nella `pom.xml` configurazione `build.gradle` di gestione delle dipendenze inizi con. `aws-java-sdk-`

**Esempio: cerca nei `pom.xml` file Maven le dipendenze SDK for Java 1.x (eseguite dalla directory principale del progetto)**

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

Output di esempio:

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

**Esempio: cerca nei file di build di Gradle le dipendenze SDK for Java 1.x (eseguito dalla directory principale del progetto)**

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

Output di esempio:

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

I `grep` comandi precedenti identificano i riferimenti SDK for Java 1.x dichiarati direttamente nei file sorgente e di build. Tuttavia, l'applicazione potrebbe dipendere dall'SDK for Java 1.x anche in modo transitivo, tramite una libreria di terze parti che a sua volta dipende dall'SDK. Usa l'albero delle dipendenze dello strumento di compilazione per trovare le dipendenze dirette e transitive dell'SDK for Java 1.x. Scegli l'esempio che corrisponde al tuo sistema di compilazione.

**Esempio: usa Maven per trovare tutte le dipendenze transitive SDK for Java 1.x (eseguite dalla directory principale del progetto)**

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

Output di esempio:

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

Il `-Dincludes=com.amazonaws` flag filtra l'albero per mostrare solo gli artefatti SDK for Java 1.x. In questo esempio, `aws-java-sdk-s3` è una dipendenza diretta, ma `aws-java-sdk-dynamodb` è una dipendenza transitiva introdotta da. `some.thirdparty:library`

**Esempio: usa Gradle per trovare tutte le dipendenze transitive SDK for Java 1.x (eseguite dalla directory principale del progetto)**

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

Output di esempio:

```
+--- 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 non ha un filtro di dipendenza integrato equivalente a quello di Maven, quindi il piping through è `-Dincludes` l'approccio più semplice. `grep`

## Ispeziona gli artefatti Java distribuibili
<a name="migration-find-v1-apps-inspect-artifacts"></a>

È possibile ispezionare gli artefatti Java distribuibili (JARs,, or EARs) per confermare se la versione 1.x è WARs inclusa nel pacchetto dell'applicazione. AWS SDK per Java I file di archivio Java sono file in formato ZIP. Per determinare se SDK for Java 1.x è presente, cerca il `com/amazonaws/sdk/versionInfo.properties` file all'interno dell'archivio. Questo file è incluso nel `aws-java-sdk-core` modulo e contiene il numero di versione dell'SDK.

### Controllo rapido con il comando `jar`
<a name="migration-find-v1-apps-jar-command"></a>

Per gli uber-jar in cui tutte le classi di dipendenza vengono unite al livello superiore, elenca il contenuto dell'archivio e cerca il file della versione:

Negli esempi seguenti, sostituiscilo `myapp.jar` con il percorso del file JAR dell'applicazione.

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

Se l'SDK è presente, l'output è:

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

Se il `jar` comando non è disponibile nel tuo ambiente (ad esempio, solo per JRE o immagini minime di container), puoi utilizzare invece: `unzip -l`

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

Per stampare la versione:

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

Output di esempio:

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

**Nota**  
I comandi precedenti cercano solo le voci di primo livello in uber-jars. Non troveranno le classi SDK in thin JARs (dove le dipendenze sono esterne) o all'interno di pacchetti annidati JARs (come quelle in WARs, EARs o i pacchetti Lambda sotto o). `lib/` `WEB-INF/lib/` Per thin JARs, controllate invece la configurazione della build (`pom.xml`,`build.gradle`) o l'albero delle dipendenze. Per nested JARs, cerca il pacchetto JARs utilizzando uno strumento in grado di leggere gli archivi ZIP in modo ricorsivo senza estrarli su disco.

# Come migrare il codice da AWS SDK per Java 1.x a 2.x
<a name="migration-howto"></a>

È possibile migrare le applicazioni SDK for Java 1.x esistenti in due modi.

1. [Approccio automatizzato utilizzando lo strumento di migrazione.](migration-tool.md)

1. [Approccio manuale](migration-steps.md) che sostituisce in modo incrementale le importazioni 1.x con le importazioni 2.x.

Ti consigliamo di iniziare utilizzando lo strumento di migrazione. Automatizza gran parte del lavoro sostitutivo di routine dal codice 1.x al 2.x. 

Poiché lo strumento [non migra tutte le funzionalità](migration-tool.md#migration-tool-limitations), dovrai cercare il codice v1 rimanente dopo aver eseguito lo strumento. Quando trovi del codice che non è stato migrato dallo strumento, segui le [step-by-step istruzioni](migration-steps.md) (approccio manuale) e utilizza [gli articoli della guida alla migrazione](migration-whats-different.md) per completare la migrazione.

**Topics**
+ [strumento di migrazione](migration-tool.md)
+ [Step-by-step istruzioni](migration-steps.md)

# AWS SDK per Java strumento di migrazione
<a name="migration-tool"></a>

 AWS SDK per Java Fornisce uno strumento di migrazione che aiuta ad automatizzare la migrazione del codice SDK for Java 1.x (V1) a 2.x (V2). Lo strumento utilizza, uno strumento open source di [OpenRewrite](https://docs.openrewrite.org/)refactoring del codice sorgente, per eseguire la migrazione. OpenRewrite utilizza regole di modifica del codice (chiamate «ricette») per aggiornare automaticamente il codice sorgente dalla sintassi e dai modelli da V1 a V2.

Lo strumento supporta le regole di modifica del codice per i client del servizio SDK e la libreria di alto livello [S3](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/transfer/TransferManager.html) Transfer Manager. Le regole di modifica del codice per altre API DynamoDB Enhanced Client di alto livello, [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)ad APIs esempio dalla V1 alla V2, non sono [supportate](dynamodb-enhanced-client.md). 

[Per maggiori dettagli sulle limitazioni, consulta la fine di questa pagina.](#migration-tool-limitations) Per esempi dettagliati di modelli di codice comuni non supportati con passaggi di migrazione manuale, consulta Modelli di [codice non supportati.](migration-tool-unsupported-patterns.md)

## Utilizza lo strumento di migrazione
<a name="migration-tool-use"></a>

### Migra un progetto Maven
<a name="migration-tool-use-maven"></a>

[Segui le istruzioni riportate di seguito per migrare il tuo progetto SDK for Java 1.x basato su Maven utilizzando lo strumento plug-in Maven. OpenRewrite](https://docs.openrewrite.org/reference/rewrite-maven-plugin)

1. Vai alla directory principale del tuo progetto Maven

   Apri una finestra di terminale (riga di comando) e vai alla directory principale dell'applicazione basata su Maven.

1. Esegui il comando del plugin `rewrite-maven-plugin`

   Puoi scegliere tra due modalità (obiettivi Maven): `dryRun` e. `run`

   **Modalità `dryRun`******

   In questa `dryRun` modalità, il plugin genera i diff log nell'output della console e un file di patch denominato `rewrite.patch` nella cartella. `target/rewrite` Questa modalità consente di visualizzare in anteprima le modifiche che verranno apportate, poiché non vengono apportate modifiche ai file del codice sorgente. 

   L'esempio seguente mostra come richiamare il plugin in `dryRun` modalità.

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

   \$1Sostituisci *<rewrite-plugin-version>* con il `rewriteMavenPluginVersion` valore che vedi in questo file di [test](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\$1Sostituisci *<sdkversion>* con una versione SDK 2.x. Visita [Maven Central](https://central.sonatype.com/artifact/software.amazon.awssdk/v2-migration) per verificare la versione più recente. 
**Importante**  
Assicurati di utilizzare la versione `rewrite-maven-plugin` mostrata nel [file di test](https://github.com/aws/aws-sdk-java-v2/blob/3a01289246f1f4ac814a354051d00030e53ef968/test/v2-migration-tests/src/test/java/software/amazon/awssdk/v2migrationtests/MavenTestBase.java#L54) perché altre versioni potrebbero non funzionare.

   L'output della console proveniente dalla `dryRun` modalità dovrebbe essere simile al seguente.

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

   **Modalità `run`******

   Quando esegui il plugin in `run` modalità, modifica il codice sorgente sul disco per applicare le modifiche. Assicurati di avere un backup del codice sorgente prima di eseguire il comando.

   L'esempio seguente mostra come richiamare il plugin in `run` modalità.

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

   *<rewrite-plugin-version>*\$1Sostituiscilo con `rewriteMavenPluginVersionvalue` quello che vedi in questo file di [test](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\$1Sostituisci *<sdkversion>* con una versione SDK 2.x. Visita [Maven Central](https://central.sonatype.com/artifact/software.amazon.awssdk/v2-migration) per verificare la versione più recente. 

   Dopo aver eseguito il comando, compila l'applicazione ed esegui dei test per verificare le modifiche. 

### Migra un progetto Gradle
<a name="migration-tool-use-gradle"></a>

[Segui le istruzioni seguenti per migrare il tuo progetto SDK for Java 1.x basato su Gradle utilizzando lo strumento plug-in Gradle. OpenRewrite](https://docs.openrewrite.org/reference/gradle-plugin-configuration)

1. Vai alla directory principale del tuo progetto Gradle

   Apri una finestra di terminale (riga di comando) e vai alla directory principale dell'applicazione basata su Gradle.

1. Crea uno script di init Gradle

   Crea un `init.gradle` file con il seguente contenuto nella directory.

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

   \$1Sostituiscilo *<rewrite-plugin-version>* con la versione che vedi in questo [file di test](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. Esegui il `rewrite` comando

   Come con il plug-in Maven, puoi eseguire il plug-in Gradle in `dryRun` modalità o. `run`

   **Modalità `dryRun`**

   L'esempio seguente mostra come richiamare il plugin in modalità. `dryRun`

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

   **Modalità `run`**

   L'esempio seguente mostra come richiamare il plugin in `run` modalità.

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

## Limitazioni attuali
<a name="migration-tool-limitations"></a>

Sebbene la migrazione supporti la maggior parte del codice V1 tramite regole di modifica del codice che si aggiornano all'equivalente V2, alcune classi e metodi non sono coperti. Per queste classi e metodi, segui le [step-by-step istruzioni](migration-steps.md) per migrare manualmente il codice.

Per alcune regole di modifica del codice non supportate, lo strumento di migrazione può aggiungere un commento che inizia con:

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

Dopo il commento, lo strumento restituisce uno stub generico della versione V2 del metodo o della classe. Ad esempio, nel seguente output, lo strumento di migrazione ha tentato di migrare il metodo del client V1 S3: `setBucketLifecycleConfiguration`

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

I collegamenti nell'elenco seguente rimandano alle informazioni sulla migrazione per aiutarti a migrare manualmente il codice.
+ [Differenze del client S3 tra la versione 1 e la versione 2 di AWS SDK per Java](migration-s3-client.md)
+ [S3 Transfer Manager](migration-s3-transfer-manager.md) () TransferManager
+ [Mappatura degli oggetti DynamoDB (](migration-ddb-mapper.md)Dynamo) DBMapper
+ [EC2 utilità per i](migration-imds.md) metadati EC2 MetadataUtils ()
+ [Camerieri (](migration-waiters.md)) AmazonDynamo DBWaiters
+ [IAM Policy Builder](migration-iam-policy-builder.md) (politica)
+ [CloudFront preassegnazione](migration-cloudfront-presigning.md) (,) CloudFrontUrlSigner CloudFrontCookieSigner
+ [Notifiche di eventi S3](migration-s3-event-notification.md) (S3) EventNotification
+ [Pubblicazione delle metriche SDK (documentazione [1.x, documentazione 2.x](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/generating-sdk-metrics.html))](metrics.md)
+ Modelli di [codice non supportati: esempi dettagliati di modelli](migration-tool-unsupported-patterns.md) di codice comuni che richiedono la migrazione manuale

# Modelli di codice non supportati dello strumento di migrazione
<a name="migration-tool-unsupported-patterns"></a>

Lo strumento di migrazione converte automaticamente la maggior parte del codice v1 in v2. Tuttavia, alcuni modelli di codice richiedono la migrazione manuale. Questo argomento fornisce esempi dettagliati dei pattern non supportati più comuni e mostra come convertirli manualmente.

Il seguente elenco di modelli non è esaustivo. Se il codice non viene compilato dopo aver eseguito lo strumento di migrazione, segui le [istruzioni di step-by-step migrazione](migration-steps.md) per migrare manualmente il codice v1 rimanente.

## Richiedi costruttori di oggetti con parametri
<a name="request-pojo-constructors"></a>

Su richiesta POJOs (escluso Amazon S3), lo strumento di migrazione trasforma solo i metodi setter. Lo strumento non supporta costruttori con parametri.

**Pattern supportato: richiedi l'oggetto utilizzando i setter (nessun parametro del costruttore)**

Prima (codice v1 originale):

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

Dopo (risultato dello strumento di migrazione):

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

**Pattern non supportato: richiedi il costruttore di oggetti con parametri**

Lo strumento di migrazione non può convertire costruttori con parametri:

Prima della migrazione manuale, ma dopo lo strumento di migrazione:

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

Lo strumento di migrazione trasforma l'importazione in v2, ma il codice del costruttore rimane invariato e richiede aggiornamenti manuali per utilizzare il pattern builder.

Dopo la migrazione manuale:

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

## Metodi client di assistenza con parametri individuali
<a name="service-client-method-overloads"></a>

Lo strumento di migrazione non è in grado di convertire i metodi dei client di servizio che utilizzano parametri individuali anziché oggetti di richiesta (escluso Amazon S3).

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

Dopo (risultato dello strumento di migrazione: non viene compilato):

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

È necessario aggiornare manualmente gli argomenti del metodo per utilizzare un oggetto di richiesta:

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

## Metodi di timeout della richiesta
<a name="request-pojo-timeout-configuration"></a>

Lo strumento di migrazione non converte i metodi che impostano i timeout sugli oggetti di richiesta.

Prima (codice v1):

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

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

Dopo (risultato dello strumento di migrazione: non viene compilato):

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

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

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

È necessario migrare manualmente per utilizzare il metodo della v2: `overrideConfiguration`

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

## Fornisci assistenza ai costruttori dei client con parametri
<a name="service-client-constructors-with-args"></a>

Lo strumento di migrazione converte i costruttori di client di servizio vuoti ma non può convertire i costruttori che accettano parametri come credenziali o configurazioni.

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

Dopo (risultato dello strumento di migrazione: non viene compilato):

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

È necessario aggiornare manualmente il costruttore del client di servizio per utilizzare il pattern builder:

```
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-stepIstruzioni di migrazione con esempio
<a name="migration-steps"></a>

Questa sezione fornisce una step-by-step guida per migrare l'applicazione che attualmente utilizza l'SDK for Java v1.x all'SDK for Java 2.x. La prima parte presenta una panoramica dei passaggi seguiti da un esempio dettagliato di migrazione.

I passaggi qui descritti descrivono la migrazione di un caso d'uso normale, in cui l'applicazione chiama Servizi AWS utilizzando client di servizi basati su modelli. Se devi migrare codice che utilizza un livello superiore APIs come [S3 Transfer Manager](migration-s3-transfer-manager.md) o la [CloudFrontprefirma](migration-cloudfront-presigning.md), consulta la sezione sotto il sommario. [Cosa c'è di diverso tra AWS SDK per Java 1.x e 2.x](migration-whats-different.md)



L'approccio qui descritto è un suggerimento. Puoi utilizzare altre tecniche e sfruttare le funzionalità di modifica del codice del tuo IDE per ottenere lo stesso risultato. 

## Panoramica delle fasi
<a name="migration-steps-overview"></a>

### 1. Inizia aggiungendo l'SDK for Java 2.x BOM
<a name="migration-steps-overview-step1"></a>

Aggiungendo l'elemento Maven BOM (Bill of Materials) per l'SDK for Java 2.x al file POM, ti assicuri che tutte le dipendenze v2 necessarie provengano dalla stessa versione. Il tuo POM può contenere dipendenze v1 e v2. Ciò consente di migrare il codice in modo incrementale anziché modificarlo tutto in una volta.

#### SDK per Java 2.x BOM
<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>
```

Puoi trovare l'[ultima versione](https://central.sonatype.com/artifact/software.amazon.awssdk/bom) sul Maven Central Repository.

### 2. Cerca nei file le istruzioni di importazione della classe v1
<a name="migration-steps-overview-step2"></a>

Scansionando i file dell'applicazione alla ricerca di SERVICE\$1 IDs utilizzato nelle importazioni v1, troverete l'unico SERVICE\$1 utilizzato. IDs Un SERVICE\$1ID è un nome breve e univoco per un. Servizio AWS Ad esempio `cognitoidentity` è SERVICE\$1ID per Amazon Cognito Identity.

### 3. Determina le dipendenze di Maven v2 dalle istruzioni di importazione v1
<a name="migration-steps-overview-step3"></a>

Dopo aver trovato tutte le versioni univoche di V1 SERVICE\$1IDs, è possibile determinare l'artefatto Maven corrispondente per la dipendenza v2 facendo riferimento a. [Nome del pacchetto per le mappature ArtifactID di Maven](#migration-serviceid-artifactid-mapping)

### 4. Aggiungi elementi di dipendenza v2 al file POM
<a name="migration-steps-overview-step4"></a>

Aggiorna il file Maven POM con gli elementi di dipendenza determinati nel passaggio 3.

### 5. Nei file Java, passa in modo incrementale dalle classi v1 alle classi v2
<a name="migration-steps-overview-step5"></a>

Quando sostituite le classi v1 con le classi v2, apportate le modifiche necessarie per supportare l'API v2, ad esempio utilizzando builder anziché costruttori e utilizzando getter e setter fluenti.

### 6. Rimuovi le dipendenze v1 Maven dalle importazioni POM e v1 dai file
<a name="migration-steps-overview-step6"></a>

Dopo aver migrato il codice per utilizzare le classi v2, rimuovi tutte le importazioni v1 rimanenti dai file e tutte le dipendenze dal file di build.

### 7. Rifattorizza il codice per utilizzare i miglioramenti dell'API v2
<a name="migration-steps-overview-step7"></a>

Dopo che il codice è stato compilato e superato con successo i test, puoi sfruttare i miglioramenti della v2, come l'utilizzo di un client HTTP o di impaginatori diversi per semplificare il codice. Questa fase è opzionale.

## Esempio di migrazione
<a name="migration-steps-example"></a>

In questo esempio, eseguiamo la migrazione di un'applicazione che utilizza l'SDK for Java v1 e accede a diversi. Servizi AWS Esaminiamo in dettaglio il seguente metodo v1 nel passaggio 5. Questo è un metodo in una classe che contiene otto metodi e nell'applicazione sono presenti 32 classi.

### metodo v1 per migrare
<a name="v1-snippet-collapsed"></a>

Di seguito sono elencate solo le importazioni dell'SDK v1 dal file 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. Aggiungi v2 Maven BOM
<a name="migration-steps-example-step1"></a>

Aggiungi la BOM Maven per l'SDK for Java 2.x al POM insieme a tutte le altre dipendenze nella sezione. `dependencyManagement` Se il tuo file POM contiene la BOM per la versione 1 dell'SDK, lasciala per ora. Verrà rimosso in una fase successiva.

#### Gestione delle dipendenze POM fin dall'inizio
<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. Cerca nei file le istruzioni di importazione della classe v1
<a name="migration-steps-example-step2"></a>

Cerca nel codice dell'applicazione le occorrenze uniche di. `import com.amazonaws.services` Questo ci aiuta a determinare le dipendenze v1 utilizzate dal progetto. Se la tua applicazione ha un file Maven POM con le dipendenze v1 elencate, puoi invece utilizzare queste informazioni. 

Per questo esempio utilizziamo il comando [`ripgrep`(rg)](https://github.com/BurntSushi/ripgrep) per cercare nella base di codice.

Dalla radice della tua base di codice, esegui il seguente `ripgrep` comando. Dopo aver `ripgrep` trovato le istruzioni di importazione, queste vengono reindirizzate a `cut``sort`, e `uniq` i comandi per isolare SERVICE\$1. IDs 

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

Per questa applicazione, i seguenti SERVICE\$1 IDs sono registrati nella console.

```
autoscaling
cloudformation
ec2
identitymanagement
```

Ciò indica che c'è stata almeno un'occorrenza di ciascuno dei seguenti nomi di pacchetto utilizzati nelle istruzioni. `import` Per i nostri scopi, i nomi delle singole classi non contano. Abbiamo solo bisogno di trovare i SERVICE\$1 IDs che vengono utilizzati.

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

### 3. Determina le dipendenze di Maven v2 dalle istruzioni di importazione v1
<a name="migration-steps-example-step3"></a>

Il SERVICE\$1 IDs per la v1 che abbiamo isolato dalla Fase 2, ad esempio `autoscaling` e, `cloudformation` può essere mappato sullo stesso SERVICE\$1ID v2 per la maggior parte. Poiché nella maggior parte dei casi l'ArtifactID di Maven v2 corrisponde al SERVICE\$1ID, hai le informazioni necessarie per aggiungere blocchi di dipendenza al tuo file POM.

La tabella seguente mostra come possiamo determinare le dipendenze v2.


| v1 SERVICE\$1ID è mappato a...nome del pacchetto | v2 SERVICE\$1ID mappa su...nome del pacchetto | dipendenza da Maven 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>  | 
|  **scalabilità automatica** `com.amazonaws.services.autoscaling.*`  |  **scalabilità automatica** `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>  | 
| gestione dell'identità\$1`com.amazonaws.services.identitymanagement.*` | sono\$1`software.amazon.awssdk.iam.*` |  <pre><dependency><br />  <groupId>software.amazon.awssdk</groupId><br />  <artifactId>iam</artifactId><br /></dependency></pre>  | 

\$1 La `iam` mappatura `identitymanagement` to è un'eccezione in cui il SERVICE\$1ID differisce tra le versioni. Fai riferimento a [Nome del pacchetto per le mappature ArtifactID di Maven](#migration-serviceid-artifactid-mapping) per le eccezioni se Maven o Gradle non sono in grado di risolvere la dipendenza v2.

### 4. Aggiungi elementi di dipendenza v2 al file POM
<a name="migration-steps-example-step4"></a>

Nel passaggio 3, abbiamo determinato i quattro blocchi di dipendenza che devono essere aggiunti al file POM. Non è necessario aggiungere una versione perché abbiamo specificato la BOM nel passaggio 1. Dopo aver aggiunto le importazioni, il nostro file POM presenta i seguenti elementi di dipendenza.

```
    ...
  <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. Nei file Java, passa in modo incrementale dalle classi v1 alle classi v2
<a name="migration-steps-example-step5"></a>

Nel metodo che stiamo migrando, vediamo
+ Un client di servizio EC2 di. `com.amazonaws.services.ec2.AmazonEC2Client`
+ Sono state utilizzate diverse classi di modelli EC2. Ad esempio `DescribeInstancesRequest` e. `DescribeInstancesResult`

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

Il nostro obiettivo è sostituire tutte le importazioni v1 con le importazioni v2. Procediamo una lezione alla volta.

#### a. Sostituisci l'istruzione di importazione o il nome della classe
<a name="migration-example-step5-substep1"></a>

Vediamo che il primo parametro del `describeRunningInstances` metodo è un'`AmazonEC2Client`istanza v1. Esegui una delle seguenti operazioni:
+ Sostituisci l'importazione per `com.amazonaws.services.ec2.AmazonEC2Client` con `software.amazon.awssdk.services.ec2.Ec2Client` e passa `AmazonEC2Client` a`Ec2Client`.
+ Cambia il tipo di parametro in `Ec2Client` e lascia che l'IDE ci richieda l'importazione corretta. Il nostro IDE ci chiederà di importare la classe v2 perché i nomi dei client sono diversi: e. `AmazonEC2Client` `Ec2Client` Questo approccio non funziona se il nome della classe è lo stesso in entrambe le versioni.

#### b. Sostituisci le classi del modello v1 con gli equivalenti v2
<a name="migration-example-step5-substep2"></a>

Dopo la modifica alla v2`Ec2Client`, se utilizziamo un IDE, vediamo errori di compilazione nella seguente dichiarazione.

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

L'errore di compilazione deriva dall'utilizzo di un'istanza di v1 `DescribeInstancesRequest` come parametro del metodo v2. `Ec2Client` `describeInstances` Per risolvere il problema, effettuate le seguenti istruzioni di sostituzione o importazione.


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

#### c. Cambia i costruttori v1 in v2 builder.
<a name="migration-example-step5-substep3"></a>

Vediamo ancora errori di compilazione perché [non ci](migration-whats-different.md#immutable-classes) sono costruttori nelle classi v2. Per risolvere il problema, apporta la seguente modifica.


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

#### d. Sostituisci gli oggetti di `*Result` risposta v1 con gli equivalenti `*Response` v2
<a name="migration-example-step5-substep4"></a>

Una differenza consistente tra v1 e v2 è che tutti [gli oggetti di risposta in v2](migration-whats-different.md#model-classname-changes) terminano con invece di. `*Response` `*Result` Sostituisci l'importazione v1 con `DescribeInstancesResult` l'importazione v2,. `DescribeInstancesResponse`

#### d. Apporta modifiche all'API
<a name="migration-example-step5-substep5"></a>

La seguente dichiarazione richiede alcune modifiche.

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

Nella v2, [i metodi setter](migration-whats-different.md#setter-getter-methods) non utilizzano `set` o with. `prefix` I metodi Getter con prefisso `get` sono presenti anche nell'SDK for Java 2.x

Le classi del modello, come l'`request`istanza, sono immutabili nella v2, quindi dobbiamo crearne una nuova con un builder. `DescribeInstancesRequest`

Nella v2, l'istruzione diventa la seguente.

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

#### d. Ripetere l'operazione fino alla compilazione del metodo con le classi v2
<a name="migration-example-step5-substep6"></a>

Continua con il resto del codice. Sostituisci le importazioni v1 con le importazioni v2 e correggi gli errori di compilazione. Se necessario, consulta il riferimento all'[API v2 e il riferimento](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/ec2/package-summary.html) [What's different](migration-whats-different.md).

Dopo aver migrato questo singolo metodo, abbiamo il seguente codice 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;
    }
...
```

Poiché stiamo migrando un singolo metodo in un file Java con otto metodi, abbiamo un mix di importazioni v1 e v2 mentre elaboriamo il file. Abbiamo aggiunto le ultime sei istruzioni di importazione man mano che eseguivamo i passaggi. 

Dopo aver migrato tutto il codice, non ci saranno più istruzioni di importazione v1.

### 6. Rimuovi le dipendenze v1 Maven dalle importazioni POM e v1 dai file
<a name="migration-steps-example-step6"></a>

Dopo aver migrato tutto il codice v1 nel file, abbiamo le seguenti istruzioni di importazione dell'SDK 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;
```

Dopo aver migrato *tutti* i file nella nostra applicazione, non abbiamo più bisogno delle dipendenze v1 nel nostro file POM. Rimuovi la BOM v1 dalla `dependencyManagement` sezione, se in uso, e tutti i blocchi di dipendenza v1.

### 7. Rifattorizza il codice per utilizzare i miglioramenti dell'API v2
<a name="migration-steps-example-step7"></a>

Per lo snippet che stiamo migrando, possiamo opzionalmente utilizzare un impaginatore v2 e lasciare che l'SDK gestisca le richieste basate su token per ulteriori dati.

Possiamo sostituire l'intera clausola con la seguente. `do`

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

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

## Nome del pacchetto per le mappature ArtifactID di Maven
<a name="migration-serviceid-artifactid-mapping"></a>

Quando migri il tuo progetto Maven o Gradle dalla v1 dell'SDK for Java alla v2, devi capire quali dipendenze aggiungere al tuo file di build. L'approccio descritto nel [step-by-stepIstruzioni di migrazione con esempio](#migration-steps) (passaggio 3) utilizza i nomi dei pacchetti nelle istruzioni di importazione come punto di partenza per determinare le dipendenze (come ArtifactID) da aggiungere al file di build. 

È possibile utilizzare le informazioni in questo argomento per mappare i nomi dei pacchetti v1 agli artifactID v2.

### Convenzione di denominazione comune utilizzata nei nomi dei pacchetti e nei Maven ArtifactID
<a name="migration-naming-convention"></a>

La tabella seguente mostra la convenzione di denominazione comune SDKs utilizzata per un determinato SERVICE\$1ID. Un SERVICE\$1ID è un identificatore univoco per un. Servizio AWS Ad esempio, il SERVICE\$1ID per il servizio Amazon S3 è `s3` ed `cognitoidentity` è il SERVICE\$1ID per Amazon Cognito Identity.


| nome del pacchetto v1 (dichiarazione di importazione) | artifactID v1 | artifactID v2 | nome del pacchetto v2 (istruzione di importazione) | 
| --- | --- | --- | --- | 
| com.amazonaws.services.service\$1id | aws-java-sdk-ID\$1SERVIZIO | ID\$1SERVIZIO | software.amazon.awssdk.services.service\$1id | 
|   | 
| Esempio di Amazon Cognito Identity (SERVICE\$1ID:) cognitoidentity | 
| com.amazonaws.services. identità cognitiva | aws-java-sdk- identità cognitiva | identità cognitiva | software.amazon.awssdk.services. identità cognitiva | 

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

#### All'interno della v1
<a name="migration-serviceid-diffs-withinv1"></a>

In alcuni casi il SERVICE\$1ID differisce tra il nome del pacchetto e l'artifactID per lo stesso servizio. Ad esempio, la riga CloudWatch Metrics della tabella seguente mostra che `metrics` è il SERVICE\$1ID nel nome del pacchetto ma è il SERVICE\$1ID dell'ArtifactID. `cloudwatchmetrics`

#### All'interno della v2
<a name="migration-serviceid-diffs-withinv2"></a>

Non ci sono differenze nel SERVICE\$1ID utilizzato nei nomi dei pacchetti e negli ArtifactID.

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

Per la maggior parte dei servizi, il SERVICE\$1ID nella v2 è lo stesso del SERVICE\$1ID della v1 sia nei nomi dei pacchetti che negli ArtifactID. Un esempio di ciò è il SERVICE\$1ID, come mostrato nella tabella precedente. `cognitoedentity` Tuttavia, alcuni SERVICE\$1 IDs differiscono tra quelli mostrati nella SDKs tabella seguente.

Un **SERVICE\$1ID in grassetto** in una delle colonne v1 indica che è diverso dal SERVICE\$1ID utilizzato nella v2.


| Nome del servizio | nome del pacchetto v1 | artifactID v1 | artifactID v2 | nome del pacchetto v2 | 
| --- | --- | --- | --- | --- | 
|  |  Tutti i nomi dei pacchetti iniziano con `com.amazonaws.services` quello mostrato nella prima riga.  |  Tutti gli ArtifactID sono racchiusi tra tag, come mostrato nella prima riga.  |  Tutti gli ArtifactID sono racchiusi tra tag, come mostrato nella prima riga.  |  Tutti i nomi dei pacchetti iniziano con `software.amazon.awssdk` quello mostrato nella prima riga.  | 
|  | 
| Gateway API | com.amazonaws.services.apigateway | <artifactId>aws-java-sdk- gateway API</artifactId> | <artifactId>una porta d'accesso</artifactId> | software.amazon.awssdk.services.apigateway | 
| Registro delle app | registro delle app | apprendistato | registro del catalogo dei servizi | registro del catalogo dei servizi | 
| Application Discovery | scoperta delle applicazioni | scoperta | scoperta delle applicazioni | scoperta delle applicazioni | 
| Runtime AI Augmented | autonomia aerea aumentata | durata dell'aria aumentata | runtime sagemaker a2i | runtime sagemakera2i | 
| Certificate Manager | gestore dei certificati | acm | acm | acm | 
| CloudControl API | API di controllo cloud | API di controllo cloud | controllo cloud | controllo del cloud | 
| CloudSearch | cloudsearch v2 | cloudsearch | cloudsearch | cloudsearch | 
| CloudSearch Dominio | dominio cloudsearch | ricerca nel cloud | dominio cloudsearch | dominio cloudsearch | 
| CloudWatch Eventi | eventi cloudwatch | eventi | eventi cloudwatch | eventi cloudwatch | 
| CloudWatch Evidentemente | Cloudwatch evidentemente | cloudwatch evidentemente | evidently | evidently | 
| CloudWatch Registri | logs | logs | log di cloudwatch | cloudwatchlogs | 
| CloudWatch Metriche | metriche | metriche cloudwatch | cloudwatch | cloudwatch | 
| CloudWatch rum | cloudwatch rum | cloudwatchrum | rum | rum | 
| Provider di identità Cognito | cognitoidp | cognitoidp | provider di cognitoidentity | provider di cognitoidentity | 
| Campagna Connect | connetti la campagna | connetti la campagna | collegare le campagne | collegare le campagne | 
| Connect Wisdom | connetti la saggezza | connettere la saggezza | wisdom | wisdom | 
| Database Migration Service | servizio di migrazione del database | dms | migrazione del database | migrazione del database | 
| DataZone | zona dati | zona dati esterna | zona dati | zona dati | 
| DynamoDB | dinamo dbv2 | dynamodb | dynamodb | dynamodb | 
| File system elastico | file system elastico | efs | efs | efs | 
| Riduzione elastica della mappa | elasticmapreduce | emr | emr | emr | 
| Glue DataBrew | incolla databrew | incollare databrew | databrew | databrew | 
| IAM Roles Anywhere | I miei ruoli sono ovunque | sono ruoli ovunque | rolesanywhere | rolesanywhere | 
| Gestione di identità | gestione dell'identità | iam | iam | iam | 
| Dati IoT | dati IoT | iot | piano dati IoT | piano dati iot | 
| Analisi Kinesis | kinesisanalytics | kinesis | kinesisanalytics | kinesisanalytics | 
| Kinesis Firehose | manichetta antincendio kinesis | kinesis | firehose | firehose | 
| Canali di segnalazione video Kinesis | canali di segnalazione video kinesis | canali di segnalazione video kinesis | segnalazione video kinesis | segnalazione video kinesis | 
| Lex | runtime lex | lex | runtime lex | lexruntime | 
| Attenzione a Vision | fai attenzione alla visione | attenzione alla visione | lookoutvision | lookoutvision | 
| Modernizzazione del mainframe | modernizzazione del mainframe | modernizzazione del mainframe | m2 | m2 | 
| Misurazione del Marketplace | misurazione del mercato | servizio di marketplacemetering | misurazione del marketplace | misurazione del marketplace | 
| Grafana gestita | grafana gestito | grafana gestita | grafana | grafana | 
| Mechanical Turk | mturk | richiedente turco meccanico | mturk | mturk | 
| Suggerimenti di strategia dell'Hub di migrazione | raccomandazioni sulla strategia dell'hub di migrazione | raccomandazioni strategiche di migrationhub | strategia migrationhubs | strategia migrationhub | 
| Nimble Studio | studio agile | studio agile | nimble | nimble | 
| 5G privato | 5g privato | 5g privato | reti private | reti private | 
| Prometheus | prometeo | prometeo | amp | amp | 
| Cestino di riciclaggio | bidone per riciclare | pattumiera | rbin | rbin | 
| API dati di Redshift | redshift data api | redshiftdataapi | dati redshift | dati redshift | 
| Route 53 | domini route53 | route53 | domini route53 | domini route53 | 
| Sage Maker Edge Manager | sagemaker edgemanager | sagemakedgemanager | sagemakeredge | sagemaker edge | 
| Token di sicurezza | token di sicurezza | sts | sts | sts | 
| Migrazione dei server | migrazione del server | migrazione del server | sms | sms | 
| Email semplice | email semplice | ses | ses | ses | 
| Email semplice V2 | email semplice v2 | ses v2 | sesv2 | sesv2 | 
| Gestione semplice dei sistemi | gestione semplice dei sistemi | ssm | ssm | ssm | 
| Flusso di lavoro semplice | flusso di lavoro semplice | flusso di lavoro semplice | swf | swf | 
| Step Functions | funzioni step | funzioni step | sfn | sfn | 

# Cosa c'è di diverso tra AWS SDK per Java 1.x e 2.x
<a name="migration-whats-different"></a>

Questa sezione descrive le principali modifiche da tenere a mente quando si converte un'applicazione dall'utilizzo della AWS SDK per Java versione 1.x alla versione 2.x.

## Modifica del nome del pacchetto
<a name="mig-diff-package-name-change"></a>

Una modifica notevole rispetto all'SDK for Java 1.x all'SDK for Java 2.x è la modifica del nome del pacchetto. I nomi dei pacchetti iniziano con `software.amazon.awssdk` SDK 2.x, mentre lo utilizza l'SDK 1.x. `com.amazonaws`

Questi stessi nomi differenziano gli artefatti Maven da SDK 1.x a SDK 2.x. Gli artefatti Maven per l'SDK 2.x utilizzano GroupID, mentre l'SDK 1.x utilizza `software.amazon.awssdk` GroupID. `com.amazonaws`

In alcuni casi il codice richiede una dipendenza per un progetto che altrimenti utilizza solo artefatti SDK 2.x`com.amazonaws`. Un esempio di ciò è quando si lavora con il lato server. AWS Lambda Questo è stato mostrato nella sezione [Configurazione di un progetto Apache Maven precedente](setup-project-maven.md#modules-dependencies) di questa guida.

**Nota**  
Diversi nomi di pacchetto nell'SDK 1.x contengono. `v2` L'uso di `v2` in questo caso di solito significa che il codice contenuto nel pacchetto è destinato a funzionare con la versione 2 del servizio.   
Poiché il nome completo del pacchetto inizia con`com.amazonaws`, si tratta di componenti SDK 1.x. Esempi di questi nomi di pacchetto nell'SDK 1.x sono:   
`com.amazonaws.services.dynamodbv2`
`com.amazonaws.retry.v2`
`com.amazonaws.services.apigatewayv2`
`com.amazonaws.services.simpleemailv2`

## Aggiungere la versione 2.x al progetto
<a name="adding-v2"></a>

Maven è il modo consigliato per gestire le dipendenze quando si utilizza la 2.x. AWS SDK per Java Per aggiungere componenti della versione 2.x al progetto, aggiorna il `pom.xml` file con una dipendenza dall'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>
```

Puoi anche [utilizzare le versioni 1.x e 2.x side-by-side durante](migration-side-by-side.md) la migrazione del progetto alla versione 2.x.

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

Client, richieste di operazione e oggetti di risposta non sono più modificabili e non possono essere cambiati dopo la creazione. Per riutilizzare una variabile di richiesta o di risposta, è necessario creare un nuovo oggetto per assegnarla.

**Example di aggiornamento di un oggetto richiesta in 1.x**  

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

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

**Example di aggiornamento di un oggetto richiesta in 2.x**  

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

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

## Metodi Setter e Getter
<a name="setter-getter-methods"></a>

Nella versione AWS SDK per Java 2.x, i nomi dei metodi setter non includono il prefisso or. `set` `with` Ad esempio, `*.withEndpoint()` è adesso. `*.endpoint()`

I nomi dei metodi Getter non utilizzano il `get` prefisso.

**Example dell'utilizzo dei metodi setter in 1.x**  

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

**Example dell'utilizzo dei metodi setter in 2.x**  

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

**Example di usare i metodi getter in 1.x**  

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

**Example di usare i metodi getter in 2.x**  

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

## nomi delle classi del modello
<a name="model-classname-changes"></a>

I nomi delle classi del modello che rappresentano le risposte di servizio terminano con `Response` la v2 anziché con `Result` quella utilizzata dalla v1.

**Example di nomi di classi che rappresentano una risposta in v1**  

```
CreateApiKeyResult
AllocateAddressResult
```

**Example di nomi di classi che rappresentano una risposta in v2**  

```
CreateApiKeyResponse
AllocateAddressResponse
```

## Stato della migrazione di librerie e utilità
<a name="migration-libraries-utilities"></a>

### SDK for Java: librerie e utilità
<a name="migration-java-sdk-libs-utils"></a>

La tabella seguente elenca lo stato di migrazione delle librerie e delle utilità per l'SDK for Java. 


| Nome della versione 1.12.x | Nome della versione 2.x | Dalla versione 2.x | 
| --- | --- | --- | 
| Dinamo DBMapper | [DynamoDbEnhancedClient](dynamodb-enhanced-client.md) | 2.12.0 | 
| Waiter | [Waiter](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 | 
| Client EC2 per metadati |  [Client EC2 Metadata](examples-ec2-IMDS.md)  | 2.19.29 | 
| Analizzatore URI S3 |  [Analizzatore URI S3](https://aws.amazon.com/blogs/devops/s3-uri-parsing-is-now-available-in-aws-sdk-for-java-2-x/)  | 2.20.41 | 
| IAM Policy Builder | [IAM Policy Builder](feature-iam-policy-builder.md) | 2.20.126 | 
| Notifiche di eventi di Amazon S3 | [Notifiche di eventi S3](examples-s3-event-notifications.md#s3-event-notification-read) | 2.25.11  | 
| Buffering lato client di Amazon SQS | [API di batch automatico delle richieste per Amazon SQS](sqs-auto-batch.md) | 2.28.0 | 
| Listener di avanzamento | Listener di avanzamento | [non ancora rilasciato](https://github.com/aws/aws-sdk-java-v2/issues/25) | 

### librerie correlate
<a name="migration-other-sdks"></a>

La tabella seguente elenca le librerie rilasciate separatamente ma che funzionano con l'SDK for Java 2.x.


| Nome utilizzato con la versione 2.x dell'SDK for Java | Dalla versione | 
| --- | --- | 
|  [Client di crittografia 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 di crittografia del database per DynamoDB](https://docs.aws.amazon.com/database-encryption-sdk/latest/devguide/ddb-java.html) | 3.0.0 2 | 

#### 1 client di crittografia Amazon S3
<a name="migration-s3-encryption-sdk"></a>

Il client di crittografia per Amazon S3 è disponibile utilizzando la seguente dipendenza Maven.

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

#### 2 SDK AWS di crittografia del database per DynamoDB
<a name="migration-ddb-encryption-sdk"></a>

Il AWS Database Encryption SDK per DynamoDB è disponibile per la versione 2 utilizzando la seguente dipendenza Maven.

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

Le informazioni sulla libreria di crittografia per DynamoDB che funziona con la versione 1 di Java SDK sono disponibili nella [AWS Database Encryption SDK Developer Guide (denominata Amazon *DynamoDB* Encryption](https://docs.aws.amazon.com/database-encryption-sdk/latest/devguide/java.html) Client for Java) e in. [GitHub](https://github.com/aws/aws-dynamodb-encryption-java)

[Per ulteriori informazioni sulla libreria di crittografia DynamoDB compatibile con la versione 2 di Java SDK, consulta la [Database Encryption SDK Developer Guide e AWS il](https://docs.aws.amazon.com/database-encryption-sdk/latest/devguide/ddb-java.html) codice sorgente. GitHub](https://github.com/aws/aws-database-encryption-sdk-dynamodb)

Le informazioni sulla migrazione sulla libreria di crittografia sono disponibili nella [AWS Database](https://docs.aws.amazon.com/database-encryption-sdk/latest/devguide/ddb-java-migrate.html) Encryption SDK Developer Guide.

### Dettagli sulla migrazione per librerie e utilità
<a name="migrate-libs-utils-details"></a>
+ [Transfer Manager](migration-s3-transfer-manager.md)
+ [Utilità per i metadati EC2](migration-imds.md)
+ [CloudFrontpreassegnazione](migration-cloudfront-presigning.md)
+ [analisi URI S3](migration-s3-uri-parser.md)
+ [DynamoDB mapping/document APIs](migration-ddb-mapper.md) 
+ [IAM Policy Builder](migration-iam-policy-builder.md)
+ [Notifiche di eventi S3](migration-s3-event-notification.md)
+ [Pubblicazione delle metriche SDK (documentazione [1.x, documentazione 2.x](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/generating-sdk-metrics.html))](metrics.md)

# Modifiche al client
<a name="migration-clients"></a>

## costruttori di client
<a name="client-builder"></a>

È necessario creare tutti i client utilizzando il metodo del generatore client. I costruttori non sono più disponibili.

**Example di creazione di un client nella versione 1.x**  

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

**Example di creazione di un client nella versione 2.x**  

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

## Nomi delle classi client
<a name="class-names"></a>

Tutti i nomi delle classi client ora contengono solo maiuscole e minuscole e non sono più preceduti da. `Amazon` Queste modifiche sono allineate ai nomi utilizzati nella AWS CLI.

**Example dei nomi delle classi in 1.x**  

```
AmazonDynamoDB
AWSACMPCAAsyncClient
```

**Example dei nomi delle classi in 2.x**  

```
DynamoDbClient
AcmAsyncClient
```


**Modifiche al nome della classe client**  

| Client 1.x | Client 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 | Non supportato  | 
| 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 | 

# Impostazioni predefinite per la creazione del client
<a name="client-creation-defaults"></a>

Nella versione 2.x, sono state apportate le seguenti modifiche alla logica di creazione del client predefinita.
+ La catena di provider di credenziali predefinita per S3 non include più credenziali anonime. È necessario specificare manualmente l'accesso anonimo a S3 utilizzando. `AnonymousCredentialsProvider`
+ Le seguenti variabili di ambiente relative alla creazione di client predefiniti sono diverse.    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/it_it/sdk-for-java/latest/developer-guide/client-creation-defaults.html)
+ Le seguenti proprietà di sistema relative alla creazione di client predefiniti sono diverse.     
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/it_it/sdk-for-java/latest/developer-guide/client-creation-defaults.html)
+ La versione 2.x non supporta le seguenti proprietà di sistema.
+     
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/it_it/sdk-for-java/latest/developer-guide/client-creation-defaults.html)
+ Il caricamento della configurazione della regione da un `endpoints.json` file personalizzato non è più supportato.

# Configurazione del client
<a name="client-configuration"></a>

In 1.x, la configurazione del client SDK è stata modificata impostando un'`ClientConfiguration`istanza sul client o sul client builder. Nella versione 2.x, la configurazione del client è suddivisa in classi di configurazione separate. Con le classi di configurazione separate, puoi configurare diversi client HTTP per client asincroni e sincroni, ma utilizzare comunque la stessa classe. `ClientOverrideConfiguration`

**Example della configurazione del client nella versione 1.x**  

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

**Example di configurazione del client sincrono nella versione 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 di configurazione del client asincrono nella versione 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();
```

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

### Modifiche importanti
<a name="client-configuration-http-notables"></a>
+ Nella versione 2.x, è possibile modificare il client HTTP da utilizzare in fase di esecuzione specificando un'implementazione utilizzando. `clientBuilder.httpClientBuilder`
+ Quando si passa un client HTTP utilizzando `clientBuilder.httpClient` a un service client builder, il client HTTP non viene chiuso per impostazione predefinita se il client di servizio si chiude. Ciò consente di condividere client HTTP tra client di servizio.
+ I client HTTP asincroni ora utilizzano un IO non bloccante.
+ Alcune operazioni ora utilizzano HTTP/2 per migliorare le prestazioni.

### Modifiche alle impostazioni
<a name="client-configuration-http-setting-diffs"></a>


| Impostazione | 1.x | Sincronizzazione 2.x, Apache | 2.x Asincrono, Netty | 
| --- | --- | --- | --- | 
|  |  <pre>ClientConfiguration clientConfig = <br />    new ClientConfiguration()</pre>  |  <pre>ApacheHttpClient.Builder httpClientBuilder = <br />    ApacheHttpClient.builder()</pre>  |  <pre>NettyNioAsyncHttpClient.Builder httpClientBuilder = <br />    NettyNioAsyncHttpClient.builder()</pre>  | 
| Connessioni max |  <pre>clientConfig.setMaxConnections(...)<br />clientConfig.withMaxConnections(...)</pre>  |  <pre>httpClientBuilder.maxConnections(...)</pre>  |  <pre>httpClientBuilder.maxConcurrency(...)</pre>  | 
| Timeout di connessione |  <pre>clientConfig.setConnectionTimeout(...)<br />clientConfig.withConnectionTimeout(...)</pre>  |  <pre>httpClientBuilder.connectionTimeout(...)<br />httpClientBuilder.connectionAcquisitionTimeout(...)</pre>  |  <pre>httpClientBuilder.connectionTimeout(...)</pre>  | 
| Timeout del socket |  <pre>clientConfig.setSocketTimeout(...)<br />clientConfig.withSocketTimeout(...)</pre>  |  <pre>httpClientBuilder.socketTimeout(...)</pre>  |  <pre>httpClientBuilder.writeTimeout(...)<br />httpClientBuilder.readTimeout(...)</pre>  | 
| Connessione TTL |  <pre>clientConfig.setConnectionTTL(...)<br />clientConfig.withConnectionTTL(...)</pre>  |  <pre>httpClientBuilder.connectionTimeToLive(...)</pre>  |  <pre>httpClientBuilder.connectionTimeToLive(...)</pre>  | 
| Connessione massima inattiva |  <pre>clientConfig.setConnectionMaxIdleMillis(...)<br />clientConfig.withConnectionMaxIdleMillis(...)</pre>  |  <pre>httpClientBuilder.connectionMaxIdleTime(...)</pre>  |  <pre>httpClientBuilder.connectionMaxIdleTime(...)</pre>  | 
| Convalida dopo l'inattività |  <pre>clientConfig.setValidateAfterInactivityMillis(...)<br />clientConfig.withValidateAfterInactivityMillis(...)</pre>  | Non supportato (funzionalità di [richiesta](https://github.com/aws/aws-sdk-java-v2/issues/new)) | Non supportato ([funzionalità di richiesta](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
| Indirizzo locale |  <pre>clientConfig.setLocalAddress(...)<br />clientConfig.withLocalAddress(...)</pre>  |  <pre>httpClientBuilder.localAddress(...)</pre>  | [Non supportato](https://github.com/aws/aws-sdk-java-v2/issues/857) | 
| Expect-continue abilitato |  <pre>clientConfig.setUseExpectContinue(...)<br />clientConfig.withUseExpectContinue(...)</pre>  |  <pre>httpClientBuilder.expectContinueEnabled(...)</pre>  | Non supportato (funzionalità di [richiesta](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>  | 

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


| Settings | 1.x | Sincronizzazione 2.x, Apache | 2.x Asincrono, 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 proxy |  <pre>clientConfig.setProxyHost(...)<br />clientConfig.withProxyHost(...)</pre>  |  <pre>proxyConfig.endpoint(...)</pre>  |  <pre>proxyConfig.host(...)</pre>  | 
| Porta proxy |  <pre>clientConfig.setProxyPort(...)<br />clientConfig.withProxyPort(...)</pre>  |  <pre>proxyConfig.endpoint(...)</pre> La [porta proxy](http-configuration-apache.md#http-configuration-apache-proxy-conf-ex) è incorporata in `endpoint`  |  <pre>proxyConfig.port(...)</pre>  | 
| Nome utente proxy |  <pre>clientConfig.setProxyUsername(...)<br />clientConfig.withProxyUsername(...)</pre>  |  <pre>proxyConfig.username(...)</pre>  |  <pre>proxyConfig.username(...)</pre>  | 
| Password proxy |  <pre>clientConfig.setProxyPassword(...)<br />clientConfig.withProxyPassword(...)</pre>  |  <pre>proxyConfig.password(...)</pre>  |  <pre>proxyConfig.password(...)</pre>  | 
| Dominio proxy |  <pre>clientConfig.setProxyDomain(...)<br />clientConfig.withProxyDomain(...)</pre>  |  <pre>proxyConfig.ntlmDomain(...)</pre>  | Non supportato ([funzionalità di richiesta](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
| Workstation proxy |  <pre>clientConfig.setProxyWorkspace(...)<br />clientConfig.withProxyWorkstation(...)</pre>  |  <pre>proxyConfig.ntlmWorkstation(...)</pre>  | Non supportato ([funzionalità di richiesta](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
| Metodi di autenticazione proxy |  <pre>clientConfig.setProxyAuthenticationMethods(...)<br />clientConfig.withProxyAuthenticationMethods(...)</pre>  |  [Non supportato](https://github.com/aws/aws-sdk-java-v2/issues/858)  | Non supportato ([funzionalità di richiesta](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
| Autenticazione proxy di base preventiva |  <pre>clientConfig.setPreemptiveBasicProxyAuth(...)<br />clientConfig.withPreemptiveBasicProxyAuth(...)</pre>  |  <pre>proxyConfig.preemptiveBasicAuthenticationEnabled(...)</pre>  | Non supportata (funzionalità di [richiesta](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
| Host non proxy |  <pre>clientConfig.setNonProxyHosts(...)<br />clientConfig.withNonProxyHosts(...)</pre>  |  <pre>proxyConfig.nonProxyHosts(...)</pre>  |  <pre>proxyConfig.nonProxyHosts(...)</pre>  | 
| Disattiva il socket proxy |  <pre>clientConfig.setDisableSocketProxy(...)<br />clientConfig.withDisableSocketProxy(...)</pre>  | Non supportato ([funzionalità di richiesta](https://github.com/aws/aws-sdk-java-v2/issues/new)) | Non supportato ([funzionalità di richiesta](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>  | 

## Sostituzioni del client
<a name="client-override-config-diffs"></a>


| Impostazione | 1.x | 2.x | 
| --- | --- | --- | 
|  |  <pre>ClientConfiguration clientConfig =<br />    new ClientConfiguration()</pre>  |  <pre>ClientOverrideConfiguration.Builder overrideConfig =<br />    ClientOverrideConfiguration.builder()</pre>  | 
| Prefisso dell'agente utente |  <pre>clientConfig.setUserAgentPrefix(...)<br />clientConfig.withUserAgentPrefix(...)</pre>  |  <pre>overrideConfig.advancedOption(<br />    SdkAdvancedClientOption.USER_AGENT_PREFIX, ...)</pre>  | 
| Suffisso dell'agente utente |  <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>  | 
| Intestazioni aggiuntive |  <pre>clientConfig.addHeader(...)<br />clientConfig.withHeader(...)</pre>  |  <pre>overrideConfig.putHeader(...)</pre>  | 
| Timeout della richiesta |  <pre>clientConfig.setRequestTimeout(...)<br />clientConfig.withRequestTimeout(...)</pre>  |  <pre>overrideConfig.apiCallAttemptTimeout(...)</pre>  | 
| Timeout di esecuzione del client |  <pre>clientConfig.setClientExecutionTimeout(...)<br />clientConfig.withClientExecutionTimeout(...)</pre>  |  <pre>overrideConfig.apiCallTimeout(...)</pre>  | 
| Usa Gzip |  <pre>clientConfig.setUseGzip(...)<br />clientConfig.withGzip(...)</pre>  |  Non supportato ([funzionalità di richiesta](https://github.com/aws/aws-sdk-java-v2/issues/new))  | 
| Suggerimento sulla dimensione del buffer del socket |  <pre>clientConfig.setSocketBufferSizeHints(...)<br />clientConfig.withSocketBufferSizeHints(...)</pre>  | Non supportato (funzionalità di [richiesta](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
| Metadati di risposta alla cache |  <pre>clientConfig.setCacheResponseMetadata(...)<br />clientConfig.withCacheResponseMetadata(...)</pre>  | Non supportato ([funzionalità di richiesta](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
| Dimensione della cache dei metadati di risposta |  <pre>clientConfig.setResponseMetadataCacheSize(...)<br />clientConfig.withResponseMetadataCacheSize(...)</pre>  | Non supportata ([funzionalità di richiesta](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
| resolver DNS |  <pre>clientConfig.setDnsResolver(...)<br />clientConfig.withDnsResolver(...)</pre>  | Non supportato ([funzionalità di richiesta](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
| keepalive TCP |  <pre>clientConfig.setUseTcpKeepAlive(...)<br />clientConfig.withTcpKeepAlive(...)</pre>  |  Questa opzione è ora nella configurazione del client HTTP <pre>- ApacheHttpClient.builder().tcpKeepAlive(true)<br />- NettyNioAsyncHttpClient.builder().tcpKeepAlive(true)</pre>  | 
| Casuale sicura |  <pre>clientConfig.setSecureRandom(...)<br />clientConfig.withSecureRandom(...)</pre>  | Non supportato ([funzionalità di richiesta](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>  | 

## Il client annulla i tentativi
<a name="client-override-retry-config-diffs"></a>


| Impostazione | 1.x | 2.x | 
| --- | --- | --- | 
|  |  <pre>ClientConfiguration clientConfig =<br />    new ClientConfiguration()</pre>  |  <pre>ClientOverrideConfiguration.Builder overrideConfigBuilder = <br />    ClientOverrideConfiguration.builder();</pre>  | 
| Numero massimo di tentativi di errore |  <pre>clientConfig.setMaxErrorRetry(...)<br />clientConfig.withMaxErrorRetry(...)</pre>  |  <pre>// Configure the default retry strategy.<br />overrideConfigBuilder.retryStrategy(b -> b.maxAttempts(...));</pre>  | 
| Usa tentativi limitati |  <pre>clientConfig.setUseThrottleRetries(...)<br />clientConfig.withUseThrottleRetries(...)</pre>  | [Non supportato](https://github.com/aws/aws-sdk-java-v2/issues/645) | 
| Numero massimo di tentativi consecutivi prima della limitazione |  <pre>clientConfig.setMaxConsecutiveRetriesBeforeThrottling(...)<br />clientConfig.withMaxConsecutiveRetriesBeforeThrottling(...)</pre>  | [Non supportato](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>  | 

## Client asincroni
<a name="client-async-config-diffs"></a>


| Impostazione | 1.x | 2.x | 
| --- | --- | --- | 
|  |  |  <pre>ClientAsyncConfiguration.Builder asyncConfig =<br />    ClientAsyncConfiguration.builder()</pre>  | 
| Esecutore |  <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>  | 

## Altre modifiche al cliente
<a name="client-config-other-diffs"></a>

La seguente `ClientConfiguration` opzione di 1.x è stata modificata nella versione 2.x dell'SDK e non ha un equivalente diretto.


| Impostazione | 1.x | Equivalente a 2.x | 
| --- | --- | --- | 
| Protocollo |  <pre>clientConfig.setProtocol(Protocol.HTTP)<br />clientConfig.withProtocol(Protocol.HTTP)</pre>  |  L'impostazione predefinita del protocollo è HTTPS. Per modificare l'impostazione, specifica il protocollo che imposta un endpoint HTTP nel client builder: <pre>clientBuilder.endpointOverride(<br />    URI.create("http://..."))</pre>  | 

# Modifiche al provider delle credenziali
<a name="migration-client-credentials"></a>

Questa sezione fornisce una mappatura delle modifiche dei nomi delle classi e dei metodi del provider di credenziali tra le versioni 1.x e 2.x di. AWS SDK per Java

## Differenze notevoli
<a name="client-credentials"></a>
+ In 2.x, il provider di credenziali predefinito carica le proprietà del sistema prima delle variabili d'ambiente. Per ulteriori informazioni, vedere [Utilizzo delle credenziali](credentials.md).
+ Il metodo del costruttore è sostituito dai metodi `create` o `builder`.  
**Example**  

  ```
  DefaultCredentialsProvider.create();
  ```
+ L'aggiornamento asincrono non è più configurato per impostazione predefinita e deve essere specificato con il `builder` del provider di credenziali.  
**Example**  

  ```
  ContainerCredentialsProvider provider = ContainerCredentialsProvider.builder()
          		.asyncCredentialUpdateEnabled(true)
          		.build();
  ```
+ È possibile indicare il percorso di un file di profilo personalizzato utilizzando `ProfileCredentialsProvider.builder()`.  
**Example**  

  ```
  ProfileCredentialsProvider profile = ProfileCredentialsProvider.builder()
          		.profileFile(ProfileFile.builder().content(Paths.get("myProfileFile.file")).build())
          		.build();
  ```
+ Il formato del file di profilo è stato modificato per migliorare la corrispondenza con la AWS CLI. Per i dettagli, vedere [Configurazione di AWS CLI nella Guida](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html) per l'*AWS Command Line Interface utente*.

## Modifiche al provider di credenziali mappate tra le versioni 1.x e 2.x
<a name="credentials-changes-mapping"></a>

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


| Cambia categoria | 1.x | 2.x | 
| --- | --- | --- | 
| Nome del pacchetto/classe | com.amazonaws.auth.AWSCredentialsProvider | software.amazon.awssdk.auth.credentials.AwsCredentialsProvider | 
| Nome del metodo | getCredentials | resolveCredentials | 
| Metodo non supportato | refresh | Non supportato | 

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


| Cambia categoria | 1.x | 2.x | 
| --- | --- | --- | 
| Nome del pacchetto/classe | com.amazonaws.auth.DefaultAWSCredentialsProviderChain | software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider | 
| Creazione | new DefaultAWSCredentialsProviderChain | DefaultCredentialsProvider.create | 
| Metodo non supportato | getInstance | Non supportato | 
| Ordine di priorità delle impostazioni esterne |  Le variabili di ambiente prima delle proprietà del sistema  |  Le proprietà del sistema prima delle variabili di ambiente  | 

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


| Cambia categoria | 1.x | 2.x | 
| --- | --- | --- | 
| Nome del pacchetto/classe | com.amazonaws.auth.AWSStaticCredentialsProvider | software.amazon.awssdk.auth.credentials.StaticCredentialsProvider | 
| Creazione | new AWSStaticCredentialsProvider | StaticCredentialsProvider.create | 

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


| Cambia categoria | 1.x | 2.x | 
| --- | --- | --- | 
| Nome del pacchetto/classe | com.amazonaws.auth.EnvironmentVariableCredentialsProvider | software.amazon.awssdk.auth.credentials.EnvironmentVariableCredentialsProvider | 
| Creazione | new EnvironmentVariableCredentialsProvider | EnvironmentVariableCredentialsProvider.create | 
| Nome della variabile di ambiente | AWS\$1ACCESS\$1KEY | AWS\$1ACCESS\$1KEY\$1ID | 
|  | AWS\$1SECRET\$1KEY | AWS\$1SECRET\$1ACCESS\$1KEY | 

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


| Cambia categoria | 1.x | 2.x | 
| --- | --- | --- | 
| Nome del pacchetto/classe | com.amazonaws.auth.SystemPropertiesCredentialsProvider | software.amazon.awssdk.auth.credentials.SystemPropertyCredentialsProvider | 
| Creazione | new SystemPropertiesCredentialsProvider | SystemPropertiesCredentialsProvider.create | 
| Nome della proprietà del sistema | aws.secretKey | aws.secretAccessKey | 

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


| Cambia categoria | 1.x | 2.x | 
| --- | --- | --- | 
| Nome del pacchetto/classe | com.amazonaws.auth.profile.ProfileCredentialsProvider | software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider | 
| Creazione | new ProfileCredentialsProvider | ProfileCredentialsProvider.create | 
| Ubicazione del profilo personalizzato |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/it_it/sdk-for-java/latest/developer-guide/migration-client-credentials.html)  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/it_it/sdk-for-java/latest/developer-guide/migration-client-credentials.html)  | 

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


| Cambia categoria | 1.x | 2.x | 
| --- | --- | --- | 
| Nome del pacchetto/classe | com.amazonaws.auth.ContainerCredentialsProvider | software.amazon.awssdk.auth.credentials.ContainerCredentialsProvider | 
| Creazione | new ContainerCredentialsProvider | ContainerCredentialsProvider.create | 
| Specificare l'aggiornamento asincrono | Non supportato | Comportamento predefinito | 

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


| Cambia categoria | 1.x | 2.x | 
| --- | --- | --- | 
| Nome del pacchetto/classe | com.amazonaws.auth.InstanceProfileCredentialsProvider | software.amazon.awssdk.auth.credentials.InstanceProfileCredentialsProvider | 
| Creazione | new InstanceProfileCredentialsProvider | InstanceProfileCredentialsProvider.create | 
| Specificare l'aggiornamento asincrono | new InstanceProfileCredentialsProvider(true) |  `InstanceProfileCredentialProvider.builder().asyncCredentialUpdateEnabled(true).build()`  | 
| Nome della proprietà di sistema | com.amazonaws.sdk.disableEc2Metadata | aws.disableEc2Metadata | 
|  | com.amazonaws.sdk.ec2MetadataServiceEndpointOverride | aws.ec2MetadataServiceEndpoint | 

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


| Cambia categoria | 1.x | 2.x | 
| --- | --- | --- | 
| Nome del pacchetto/classe | com.amazonaws.auth.STSAssumeRoleSessionCredentialsProvider | software.amazon.awssdk.services.sts.auth.StsAssumeRoleCredentialsProvider | 
| Creazione |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/it_it/sdk-for-java/latest/developer-guide/migration-client-credentials.html)  | StsAssumeRoleCredentialsProvider.builder | 
| Aggiornamento asincrono | Comportamento predefinito | Comportamento predefinito | 
| Configurazione | new STSAssumeRoleSessionCredentialsProvider.Builder | Configura una richiesta e StsClient AssumeRoleRequest | 

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


| Cambia categoria | 1.x | 2.x | 
| --- | --- | --- | 
| Nome del pacchetto/classe | com.amazonaws.auth.STSSessionCredentialsProvider | software.amazon.awssdk.services.sts.auth.StsGetSessionTokenCredentialsProvider | 
| Creazione |  `new STSSessionCredentialsProvider`  | StsGetSessionTokenCredentialsProvider.builder | 
| Aggiornamento asincrono | Comportamento predefinito | StsGetSessionTokenCredentialsProvider.builder | 
| Configurazione | Parametri del costruttore | Configura una GetSessionTokenRequest richiesta StsClient and in un builder | 

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


| Cambia categoria | 1.x | 2.x | 
| --- | --- | --- | 
| Nome del pacchetto/classe | com.amazonaws.auth.WebIdentityFederationSessionCredentialsProvider | software.amazon.awssdk.services.sts.auth.StsAssumeRoleWithWebIdentityCredentialsProvider | 
| Creazione |  `new WebIdentityFederationSessionCredentialsProvider`  | StsAssumeRoleWithWebIdentityCredentialsProvider.builder | 
| Aggiornamento asincrono | Comportamento predefinito | StsAssumeRoleWithWebIdentityCredentialsProvider.builder | 
| Configurazione | Parametri del costruttore | Configura una AssumeRoleWithWebIdentityRequest richiesta StsClient and in un builder | 

### Classi sostituite
<a name="credentials-provider-changes-Replacements"></a>


| classe 1.x | classi sostitutive 2.x | 
| --- | --- | 
| com.amazonaws.auth.EC2ContainerCredentialsProviderWrapper | software.amazon.awssdk.auth.credentials.ContainerCredentialsProvider e software.amazon.awssdk.auth.credentials.InstanceProfileCredentialsProvider | 
| com.amazonaws.services.s3.S3CredentialsProviderChain | software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider e software.amazon.awssdk.auth.credentials.AnonymousCredentialsProvider | 

### Classi rimosse
<a name="credentials-provider-changes-Removed"></a>


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

# Modifiche alla regione
<a name="migration-client-region"></a>

Questa sezione descrive le modifiche implementate nella versione AWS SDK per Java 2.x per l'utilizzo delle classi and. `Region` `Regions`

## Configurazione della regione
<a name="region-configuration"></a>
+ Alcuni AWS servizi non dispongono di endpoint specifici per regione. Quando si utilizzano questi servizi, è necessario impostare la regione come `Region.AWS_GLOBAL` o `Region.AWS_CN_GLOBAL`.  
**Example**  

  ```
  Region region = Region.AWS_GLOBAL;
  ```
+  Le classi `com.amazonaws.regions.Regions` e `com.amazonaws.regions.Region` sono ora combinate in un'unica classe, `software.amazon.awssdk.regions.Region`.

## Mappature dei nomi di metodi e classi
<a name="region-method-mapping"></a>

Le tabelle seguenti mappano le classi relative alla regione tra le versioni 1.x e 2.x di. AWS SDK per JavaÈ possibile creare un'istanza di tali classi utilizzando il metodo `of()`.

**Example**  

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


**1.x Modifiche al metodo della classe Regions**  

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


**1.x Modifiche al metodo della classe Region**  

| 1.x | 2.x | 
| --- | --- | 
|  `Region.getName`  |  `Region.id`  | 
|  `Region.hasHttpsEndpoint`  |  Non supportato  | 
|  `Region.hasHttpEndpoint`  |  Non supportato  | 
|  `Region.getAvailableEndpoints`  |  Non supportato  | 
|  `Region.createClient`  |  Non supportato  | 


**RegionMetadata modifiche al metodo di classe**  

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


**ServiceMetadata modifiche al metodo di classe**  

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

# Modifiche alle operazioni, alle richieste e alle risposte
<a name="migration-operation-requests-responses"></a>

Nella versione 2 dell'SDK for Java, le richieste vengono passate a un'operazione client. Ad esempio `DynamoDbClient's` `PutItemRequest` viene passato all'`DynamoDbClient.putItem`operazione. Queste operazioni restituiscono una risposta da Servizio AWS, ad esempio un`PutItemResponse`.

La versione 2 dell'SDK for Java presenta le seguenti modifiche rispetto alla versione 1.
+ Le operazioni con più pagine di risposta ora dispongono di un `Paginator` metodo per l'iterazione automatica su tutti gli elementi della risposta.
+ Non è possibile modificare le richieste e le risposte.
+ È necessario creare richieste e risposte con un metodo di creazione statico anziché con un costruttore. Ad esempio, la versione 1 `new PutItemRequest().withTableName(...)` è ora. `PutItemRequest.builder().tableName(...).build()`
+ Le operazioni supportano un modo breve per creare richieste:`dynamoDbClient.putItem(request -> request.tableName(...))`.

Le sezioni seguenti descrivono le modifiche specifiche tra la versione 1 e la versione 2. Alcune modifiche ai tipi di parametri possono essere convertite automaticamente utilizzando lo [strumento di migrazione](migration-tool.md), mentre altre modifiche richiedono aggiornamenti manuali del codice.

# Modifiche ai parametri di data
<a name="migration-date-parameters"></a>

Nella versione 1, molte operazioni accettavano `java.util.Date` oggetti per parametri basati sul tempo. Nella versione 2, queste operazioni utilizzano invece `java.time.Instant` oggetti.

È possibile convertire `Date` i parametri automaticamente utilizzando lo [strumento di migrazione](migration-tool.md) oppure è possibile convertirli manualmente chiamando il `toInstant()` metodo sull'`Date`oggetto.

**Example - Genera un URL predefinito con una data di scadenza nella versione 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 - Genera un URL predefinito con scadenza istantanea nella versione 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());
```

# Modifiche alla gestione dei dati binari
<a name="migration-binary-data"></a>

Nella versione 1, i dati binari venivano gestiti utilizzando `ByteBuffer` direttamente gli oggetti. Nella versione 2, l'SDK utilizza `SdkBytes` oggetti che forniscono un modo più comodo e sicuro per lavorare con i dati binari.

È possibile `SdkBytes` eseguire la conversione in formato `ByteBuffer` automatico utilizzando lo [strumento di migrazione](migration-tool.md) oppure è possibile convertirli manualmente richiamando l'oggetto `asByteBuffer()` restituito. `SdkBytes`

**Example - Ottieni dati binari da un attributo di messaggio nella versione 1**  

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

**Example - Ottieni dati binari da un attributo del messaggio nella versione 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());
```

# Modifiche ai parametri di timeout
<a name="migration-timeout-parameters"></a>

Nella versione 1, i valori di timeout venivano specificati come valori interi che rappresentano millisecondi. Nella versione 2, i parametri di timeout utilizzano `java.time.Duration` oggetti per una maggiore sicurezza e chiarezza dei tipi.

È possibile convertire automaticamente i valori numerici di timeout utilizzando lo [strumento di migrazione](migration-tool.md) oppure è possibile convertirli manualmente racchiudendo i valori numerici con il metodo di fabbrica appropriato. `Duration`

**Example - Imposta un timeout per la richiesta nella versione 1**  

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

**Example - Imposta un timeout della richiesta nella versione 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
```

È possibile utilizzare i seguenti metodi di `Duration` fabbrica per i valori di timeout:
+ `Duration.ofMillis(long millis)`- Per valori in millisecondi.
+ `Duration.ofSeconds(long seconds)`- Per valori secondari.
+ `Duration.ofMinutes(long minutes)`- Per valori minuti.

# Differenze nelle operazioni di streaming tra 1.x e 2.x del AWS SDK per Java
<a name="migration-streaming-ops"></a>

Le operazioni di streaming, come Amazon S3 `getObject` e `putObject` i metodi, supportano il non blocco I/O nella versione 2.x dell'SDK. Di conseguenza, gli oggetti del modello di richiesta e risposta non accettano più un `InputStream` parametro. Invece, per le richieste sincrone, l'oggetto di richiesta accetta`RequestBody`, che è un flusso di byte. L'equivalente asincrono accetta un. `AsyncRequestBody`

**Example del `putObject` funzionamento di Amazon S3 nella versione 1.x**  

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

**Example del `putObject` funzionamento di Amazon S3 nella versione 2.x**  

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

Un oggetto di risposta in streaming accetta un `ResponseTransformer` per i client sincroni e un `AsyncResponseTransformer` per i client asincroni nella V2.

**Example del `getObject` funzionamento di Amazon S3 nella versione 1.x**  

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

**Example del `getObject` funzionamento di Amazon S3 nella versione 2.x**  

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

Nell'SDK for Java 2.x, le operazioni di risposta in streaming dispongono di `AsBytes` un metodo per caricare la risposta in memoria e semplificare le conversioni di tipo comune in memoria.

# Differenze di serializzazione tra 1.x e 2.x del AWS SDK per Java
<a name="migration-serialization-changes"></a>

## Elenca gli oggetti per richiedere la differenza dei parametri
<a name="serialization-diffs-list-obj-to-req-param"></a>

Gli SDK for Java v1.x e v2.x differiscono nel modo in cui serializzano gli oggetti List per richiedere i parametri.

L'SDK for Java 1.x non serializza un elenco vuoto, mentre l'SDK for Java 2.x serializza un elenco vuoto come parametro vuoto.

Ad esempio, considera un servizio con a che richiede un. `SampleOperation` `SampleRequest` `SampleRequest`Accetta due parametri, un tipo String `str1` e un tipo List`listParam`, come mostrato negli esempi seguenti.

**Example `SampleOperation`o in 1.x**  

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

sampleServiceV1Client.sampleOperation(v1Request);
```
La registrazione a livello di cavo mostra che il `listParam` parametro non è serializzato.  

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

**Example `SampleOperation`di in 2.x**  

```
sampleServiceV2Client.sampleOperation(b -> b
    .str1("TestName"));
```
La registrazione a livello di cavo mostra che il `listParam` parametro è serializzato senza alcun valore.  

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

## POJOs in V1 rispetto ai builder in V2
<a name="serialization-json-objects"></a>

[Poiché l'SDK V1 per Java utilizza classi POJO mutabili, le librerie di serializzazione e deserializzazione, come Jackson, possono utilizzare direttamente gli oggetti del modello.](https://github.com/FasterXML/jackson-docs) 

L'SDK V2 per Java, al contrario, utilizza oggetti del modello immutabili. È necessario utilizzare un builder intermedio per eseguire la de/serializzazione.

L'esempio seguente mostra le differenze tra de/serializing una chiamata `headBucket` API con V1 e V2 che utilizza 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();
    }
```

# Differenze di deserializzazione tra 1.x e 2.x del AWS SDK per Java
<a name="migration-deserialization-changes"></a>

## Raccolte vuote nella V2 rispetto alla V1 `nulls`
<a name="deserialization-diffs-list-obj-to-req-param"></a>

Gli SDK for Java v1.x e v2.x differiscono nel modo in cui deserializzano le risposte JSON con elenchi e mappe vuoti.

Quando l'SDK riceve una risposta con una proprietà mancante modellata come elenco o mappa, V1 deserializza la proprietà mancante su, mentre V2 deserializza la proprietà su un oggetto di raccolta vuoto immutabile. `null`

Ad esempio, considerate la risposta restituita per il `describeTable` metodo da un client DynamoDB. Il seguente metodo di esempio contiene un client DynamoDB V2 e un client DynamoDB V1 che eseguono entrambi il metodo su una tabella che non ha indici secondari globali`describeTable`.

**Example della deserializzazione di una proprietà modellata come elenco mancante nella risposta**  

```
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>");
    }
}
```
Quanto segue mostra l'output registrato:  

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

Java SDK 2.x adotta un approccio idiomatico deserializzando elenchi e mappe vuoti su raccolte vuote immutabili anziché restituirle, promuovendo un codice più sicuro e conciso. `null` Con V2, è possibile verificare se un servizio ha restituito un attributo modellato come elenco o mappa con il metodo, come mostrato nell'esempio precedente. `has*` `hasGlobalSecondaryIndexes`

Questo approccio evita la necessità di `null` controlli espliciti e si allinea alle moderne best practice Java per la gestione di strutture di dati assenti o vuote.

### Esempio 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 risposta JSON per il `describeTable` metodo del client V1 e V2 non contiene alcun attributo: `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
    }
  }
}
```

# Modifiche alle eccezioni
<a name="migration-exception-changes"></a>

I nomi delle classi di eccezione, le loro strutture e le loro relazioni sono cambiati. `software.amazon.awssdk.core.exception.SdkException`è la nuova `Exception` classe base estesa da tutte le altre eccezioni.

La tabella fornisce una mappatura delle modifiche ai nomi delle classi di eccezioni.


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

La tabella seguente mappa i metodi sulle classi di eccezioni tra le versioni 1.x e 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`   | 

# Modifiche specifiche del servizio
<a name="migration-service-changes"></a>

## Modifiche ad Amazon S3
<a name="s3-operations-name"></a>

SDK for Java 2.x disabilita l'accesso anonimo per impostazione predefinita. Di conseguenza, è necessario abilitare l'accesso anonimo utilizzando. `AnonymousCredentialsProvider`

### Modifiche al nome dell'operazione
<a name="s3-op-name-changes"></a>

Molti dei nomi delle operazioni per il Amazon S3 client sono cambiati nella versione AWS SDK per Java 2.x. Nella versione 1.x, il Amazon S3 client non viene generato direttamente dall'API del servizio. Questo provocava incoerenze tra l'API di servizio e le operazioni SDK. Nella versione 2.x, ora generiamo il Amazon S3 client in modo che sia più coerente con l'API del servizio.

La tabella seguente mostra i nomi delle operazioni nelle due versioni.


**Nomi delle operazioni di 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 | 

## Modifiche ad Amazon SNS
<a name="sns-changes"></a>

Un client SNS non può più accedere agli argomenti SNS in regioni diverse dalla regione a cui è configurato per accedere.

## Modifiche ad Amazon SQS
<a name="sqs-changes"></a>

Un client SQS non può più accedere alle code SQS in regioni diverse dalla regione a cui è configurato per accedere.

## Modifiche ad Amazon RDS
<a name="rds-changes"></a>

L'SDK for Java 2.x `RdsUtilities#generateAuthenticationToken` utilizza al posto della `RdsIamAuthTokenGenerator` classe in 1.x.

# Modifiche nell'utilizzo di Amazon S3 dalla versione 1 alla versione 2 del AWS SDK per Java
<a name="migration-s3"></a>

 AWS SDK for Java 2.x Introduce modifiche significative al client S3, tra cui una nuova struttura dei pacchetti, nomi di classe aggiornati e firme dei metodi riviste. Sebbene molti metodi possano essere migrati automaticamente dalla V1 alla V2 utilizzando [lo strumento di migrazione, alcuni richiedono la migrazione manuale](migration-tool.md), come e. `listNextBatchOfObjects` `selectObjectContent` Inoltre, la V2 sostituisce alcune classi V1 come e con nuove implementazioni. `AccessControlList` `CannedAccessControlList`

**Topics**
+ [Differenze del client S3 tra la versione 1 e la versione 2 di AWS SDK per Java](migration-s3-client.md)
+ [Eseguire la migrazione di Transfer Manager dalla versione 1 alla versione 2 di AWS SDK per Java](migration-s3-transfer-manager.md)
+ [Modifiche nell'analisi di Amazon URIs S3 dalla versione 1 alla versione 2](migration-s3-uri-parser.md)
+ [Modifiche all'API S3 Event Notifications dalla versione 1 alla versione 2](migration-s3-event-notification.md)

# Differenze del client S3 tra la versione 1 e la versione 2 di AWS SDK per Java
<a name="migration-s3-client"></a>

In questo argomento, le differenze tra i client S3 nella versione 1 e nella versione 2 di SDK for Java sono organizzate in base al modo in cui lo strumento di [migrazione può automatizzare la migrazione](migration-tool.md). Lo strumento supporta la migrazione della maggior parte dei metodi dalla V1 alla V2, ma alcuni metodi richiedono la migrazione manuale. Oltre ai metodi client S3, alcune classi S3 V1 non dispongono di un equivalente diretto alla versione V2 che richieda la migrazione manuale.

**Contents**
+ [Esempi di metodi V1 supportati dallo strumento di migrazione](#methods-tool-migration)
  + [`putObject`](#V1-V2-putobject)
  + [`getObject`](#V1-V2-getobject)
+ [Metodi V1 che richiedono la migrazione manuale](#s3-methods-manual-migration)
  + [`getObject` tramite `S3ObjectId`](#V1s-getObject-using-V1s-S3ObjectId)
  + [`getETag` tramite `ObjectMetadata`](#V1s-ObjectMetadata-using-V1s-getETag)
  + [`listNextBatchOfObjects`](#V1-listNextBatchOfObjects)
  + [`listNextBatchOfVersions`](#V1-listNextBatchOfVersions)
  + [`selectObjectContent`](#V1-selectObjectContent)
  + [`setBucketAcl`](#V1-setBucketAcl)
  + [`setObjectAcl`](#V1-setObjectAcl)
  + [`initiateMultipartUpload`](#V1-initiateMultipartUpload)
    + [Esempio di migrazione](#V1-initiateMultipartUpload-migration-ex)
    + [Differenze di implementazione](#V1-initiateMultipartUpload-impl-diffs)
  + [`setRegion`](#V1-setRegion)
  + [`setS3ClientOptions(S3ClientOptions clientOptions)`](#V1-setS3ClientOptions)
  + [`setBucketLoggingConfiguration`](#V1-setBucketLoggingConfiguration)
  + [`setBucketLifecycleConfiguration`](#V1-setBucketLifecycleConfiguration)
  + [`setBucketTaggingConfiguration`](#V1-setBucketTaggingConfiguration)
+ [Classi V1 che richiedono la migrazione manuale](#s3-classes-manual-migration)
  + [`AccessControlList`](#V1-AccessControlList)
  + [`CannedAccessControlList`](#V1-CannedAccessControlList)
  + [`BucketNotificationConfiguration`](#V1-BucketNotificationConfiguration)
  + [`MultiFactorAuthentication`](#V1-MultifactorAuthentication)

## Esempi di metodi V1 supportati dallo strumento di migrazione
<a name="methods-tool-migration"></a>

Lo strumento di migrazione migra automaticamente la maggior parte dei metodi dalla V1 alla V2. I `getObject` metodi `putObject` and sono due esempi.

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

## Metodi V1 che richiedono la migrazione manuale
<a name="s3-methods-manual-migration"></a>

È necessario migrare manualmente i seguenti metodi client V1 S3. Quando si utilizza lo strumento di migrazione, viene visualizzato un commento nel file Java di output V2 che rimanda a questo argomento.

### La V1 `getObject` utilizza le versioni da V1 a V2 `S3ObjectId` `GetObjectRequest.builder()`
<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);
```

### La V1 sta `getETag()` usando la V1 sulla V2 `ObjectMetadata` `GetObjectResponse.eTag()`
<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());
```

### Da V1 a V2 `listNextBatchOfObjects` `listObjectsV2Paginator`
<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());
    });
}
```

### Da V1 a V2 `listNextBatchOfVersions` `listObjectVersionsPaginator`
<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.
```

### Il metodo da V1 `setBucketAcl` a V2 è attivo `acl` `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);
```

### Metodo da V1 `setObjectAcl` a V2 attivo `acl` `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);
```

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

#### Esempio di migrazione
<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();
```

#### Differenze di implementazione
<a name="V1-initiateMultipartUpload-impl-diffs"></a>

Il valore di `Content-Type` intestazione predefinito per i seguenti metodi è diverso come illustrato nella tabella seguente.


****  

| Versione SDK | Metodo | Valore predefinito `Content-Type` | 
| --- | --- | --- | 
| versione 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 | 
| versione 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 | 

### `region`Metodo da V1 `setRegion` a V2 su Client Builder
<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();
```

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

Invece di utilizzare un singolo `S3ClientOptions` oggetto con il `setS3ClientOptions` metodo, V2 fornisce metodi sul client builder per impostare le opzioni.

### Da V1 a V2 `setBucketLoggingConfiguration` `putBucketLogging`
<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);
```

### Da V1 a V2 `setBucketLifecycleConfiguration` `putBucketLifecycleConfiguration`
<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);
```

### Da V1 a V2 `setBucketTaggingConfiguration` `putBucketTagging`
<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);
```

## Classi V1 che richiedono la migrazione manuale
<a name="s3-classes-manual-migration"></a>

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

### Da V1 a V2 `CannedAccessControlList` ed enumerazioni `BucketCannedACL` `ObjectCannedACL`
<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));
```

### Da V1 a V2 `BucketNotificationConfiguration` `NotificationConfiguration`
<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));
```

### Da V1 `MultiFactorAuthentication` al `mfa` metodo di V2 su un generatore di richieste
<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);
```

# Eseguire la migrazione di Transfer Manager dalla versione 1 alla versione 2 di AWS SDK per Java
<a name="migration-s3-transfer-manager"></a>

Questa guida alla migrazione illustra le principali differenze tra Transfer Manager v1 e S3 Transfer Manager v2, incluse le modifiche al costruttore, le mappature dei metodi e gli esempi di codice per le operazioni più comuni. Dopo aver esaminato queste differenze, puoi migrare correttamente il codice esistente di Transfer Manager per sfruttare le prestazioni migliorate e le operazioni asincrone della v2.

**Informazioni sullo strumento di migrazione SDK AWS**  
 AWS SDK per Java Fornisce [uno strumento di migrazione](migration-tool.md) automatizzato in grado di migrare gran parte dell'API v1 Transfer Manager alla v2. Tuttavia, lo strumento di migrazione non supporta diverse funzionalità di v1 Transfer Manager. In questi casi, è necessario migrare manualmente il codice di Transfer Manager seguendo le indicazioni riportate in questo argomento.  
In questa guida, **lo stato della migrazione** mostra se lo strumento di migrazione può migrare automaticamente un costruttore, un metodo o una funzionalità:  
**Supportato**: lo strumento di migrazione può trasformare automaticamente questo codice
**Non supportato**: è necessario migrare manualmente il codice
Anche per gli elementi contrassegnati come «Supportati», esamina i risultati della migrazione ed esegui accuratamente i test. La migrazione di Transfer Manager comporta modifiche architetturali significative da operazioni sincrone a operazioni asincrone.

## Panoramica di
<a name="s3-tm-migration-overview"></a>

S3 Transfer Manager v2 introduce modifiche significative all'API Transfer Manager. S3 Transfer Manager v2 è basato su operazioni asincrone e offre prestazioni migliori, soprattutto quando si utilizza il client Amazon S3 basato su CRT. AWS 

### Differenze principali
<a name="s3-tm-migration-key-differences"></a>
+ **Package**: `com.amazonaws.services.s3.transfer` → `software.amazon.awssdk.transfer.s3`
+ **Nome della classe**: `TransferManager` → `S3TransferManager`
+ **Dipendenza dal client**: client Amazon S3 sincrono → Client Amazon S3 asincrono () `S3AsyncClient`
+ **Architettura**: operazioni sincrone → Operazioni asincrone con `CompletableFuture`
+ **Prestazioni: migliorate** con il supporto client basato su CRT AWS 

## Modifiche di alto livello
<a name="s3-tm-migration-high-level-changes"></a>


| Aspetto | V1 | V2 | 
| --- | --- | --- | 
| Dipendenza da Maven | aws-java-sdk-s3 | s3-transfer-manager | 
| Pacchetto | com.amazonaws.services.s3.transfer | software.amazon.awssdk.transfer.s3 | 
| Classe principale | TransferManager | S3TransferManager | 
| Client Amazon S3 | AmazonS3(sincronizzazione) | S3AsyncClient(asincrono) | 
| Tipi di restituzione | Operazioni di blocco | CompletableFuture<T> | 

## Dipendenze da 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 [Ultima versione](https://central.sonatype.com/artifact/com.amazonaws/aws-java-sdk-bom). 2 [Ultima versione](https://central.sonatype.com/artifact/software.amazon.awssdk/bom). 3 [Ultima versione](https://central.sonatype.com/artifact/software.amazon.awssdk.crt/aws-crt).

## Migrazione di Client Constructor
<a name="s3-tm-migration-client-constructor"></a>

### Costruttori supportati (migrazione automatica)
<a name="s3-tm-migration-supported-constructors"></a>


| Costruttore V1 | Equivalente a V2 | Stato migrazione | 
| --- | --- | --- | 
| new TransferManager() | S3TransferManager.create() | Supportata | 
| TransferManagerBuilder. defaultTransferManager() | S3TransferManager.create() | Supportato | 
| TransferManagerBuilder. standard().build() | S3TransferManager.builder().build() | Supportato | 
| new TransferManager(AWSCredentials) | S3TransferManager.builder() .s3Client(S3AsyncClient.builder() .credentialsProvider(...).build()) .build() | Supportato | 
| new TransferManager( AWSCredentialsProvider) | S3TransferManager.builder() .s3Client(S3AsyncClient.builder() .credentialsProvider(...).build()) .build() | Supportata | 

### Costruttori non supportati (è richiesta la migrazione manuale)
<a name="s3-tm-migration-unsupported-constructors"></a>


| Costruttore V1 | Equivalente a V2 | Note sulla migrazione | 
| --- | --- | --- | 
| new TransferManager(AmazonS3) | È richiesta la migrazione manuale | Crea un file S3AsyncClient separato | 
| new TransferManager(AmazonS3, ExecutorService) | È richiesta la migrazione manuale | Crea S3AsyncClient e configura un executor | 
| new TransferManager(AmazonS3, ExecutorService, boolean) | È richiesta la migrazione manuale | shutDownThreadPoolsparametro non supportato | 

### Esempi di migrazione manuale
<a name="s3-tm-migration-manual-examples"></a>

**Codice V1:**

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

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

## Migrazione del metodo client
<a name="s3-tm-migration-client-methods"></a>

Attualmente, lo strumento di migrazione supporta `resumeUpload` metodi di base `copy` `download` `upload``uploadDirectory`,`downloadDirectory`,`resumeDownload`,, e.

### Metodi di trasferimento di base
<a name="s3-tm-migration-core-transfer-methods"></a>


| Metodo V1 | Metodo V2 | Modifica del tipo di restituzione | Stato migrazione | 
| --- | --- | --- | --- | 
| upload(String, String, File) | uploadFile(UploadFileRequest) | Upload → FileUpload | Supportata | 
| upload(PutObjectRequest) | upload(UploadRequest) | Upload → Upload | Supportato | 
| download(String, String, File) | downloadFile(DownloadFileRequest) | Download → FileDownload | Supportato | 
| download(GetObjectRequest, File) | downloadFile(DownloadFileRequest) | Download → FileDownload | Supportato | 
| copy(String, String, String, String) | copy(CopyRequest) | Copy → Copy | Supportato | 
| copy(CopyObjectRequest) | copy(CopyRequest) | Copy → Copy | Supportato | 
| uploadDirectory(String, String, File, boolean) | uploadDirectory( UploadDirectoryRequest) | MultipleFileUpload → DirectoryUpload | Supportato | 
| downloadDirectory(String, String, File) | downloadDirectory( DownloadDirectoryRequest) | MultipleFileDownload → DirectoryDownload | Supportata | 

### Metodi di trasferimento riutilizzabili
<a name="s3-tm-migration-resumable-methods"></a>


| Metodo V1 | Metodo V2 | Stato migrazione | 
| --- | --- | --- | 
| resumeUpload(PersistableUpload) | resumeUploadFile(ResumableFileUpload) | Supportata | 
| resumeDownload(PersistableDownload) | resumeDownloadFile(ResumableFileDownload) | Supportata | 

### Metodi del ciclo di vita
<a name="s3-tm-migration-lifecycle-methods"></a>


| Metodo V1 | Metodo V2 | Stato migrazione | 
| --- | --- | --- | 
| shutdownNow() | close() | Supportata | 
| shutdownNow(boolean) | Regola manualmente il codice usando il metodo close() | Non supportato | 

### Metodi client V1 non supportati
<a name="s3-tm-migration-unsupported-methods"></a>


| Metodo V1 | Alternativa V2 | Note | 
| --- | --- | --- | 
| abortMultipartUploads(String, Date) | Usa il client Amazon S3 di basso livello | Non supportato | 
| getAmazonS3Client() | Salva un riferimento separatamente | Non supportato; nessun getter nella v2 | 
| getConfiguration() | Salva un riferimento separatamente | Non supportato; nessun getter nella v2 | 
| uploadFileList(...) | Effettua più chiamate uploadFile() | Non supportato | 
| copymetodi con un TransferStateChangeListener parametro | Utilizzare TransferListener | [Vedi esempio di migrazione manuale](#tm-unsupported-client-methods-copy) | 
| downloadmetodi con un S3ProgressListener parametro | Utilizzare [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) | [Vedi esempio di migrazione manuale](#tm-unsupported-client-methods-download) | 
|  `downloadDirectory`metodi con 4 o più parametri  |  | [Vedi esempio di migrazione manuale](#tm-unsupported-client-methods-download-dir) | 
| uploadmetodo con un ObjectMetadataProvider parametro | Imposta i metadati nella richiesta | [Vedi esempio di migrazione manuale](#tm-unsupported-client-methods-upload) | 
| uploadDirectorymetodi con \$1Provider parametro | Imposta i tag nella richiesta | [Vedi esempio di migrazione manuale](#tm-unsupported-client-methods-uploadDirectory) | 

#### `copy`metodi con un `TransferStateChangeListener` parametro
<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);
```

#### `download`metodi con un `S3ProgressListener` parametro
<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.
```

#### `downloadDirectory`metodi con 4 o più parametri
<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);
```

#### `upload`metodo con `ObjectMetadata` parametro
<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 `ObjectMetadataProvider` parametro
<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);
```

## Migrazione degli oggetti del modello
<a name="s3-tm-migration-model-objects"></a>

Nel AWS SDK for Java 2.x, molti oggetti del `TransferManager` modello sono stati riprogettati e diversi metodi getter e setter disponibili negli oggetti del modello v1 non sono più supportati. 

Nella v2, è possibile utilizzare la `CompletableFuture<T>` classe per eseguire azioni quando il trasferimento viene completato, con successo o con un'eccezione. È possibile utilizzare il `join()` metodo per attendere il completamento, se necessario. 

### Oggetti di trasferimento principali
<a name="s3-tm-migration-core-transfer-objects"></a>


| Classe V1 | Classe V2 | Stato migrazione | 
| --- | --- | --- | 
| TransferManager | S3TransferManager | Supportata | 
| TransferManagerBuilder | S3TransferManager.Builder | Supportato | 
| Transfer | Transfer | Supportata | 
| AbortableTransfer | Transfer | Supportata (nessuna classe separata) | 
| Copy | Copy | Supportata | 
| Download | FileDownload | Supportato | 
| Upload | Upload / FileUpload | Supportato | 
| MultipleFileDownload | DirectoryDownload | Supportato | 
| MultipleFileUpload | DirectoryUpload | Supportata | 

### Oggetti di persistenza
<a name="s3-tm-migration-persistence-objects"></a>


| Classe V1 | Classe V2 | Stato migrazione | 
| --- | --- | --- | 
| PersistableDownload | ResumableFileDownload | Supportata | 
| PersistableUpload | ResumableFileUpload | Supportato | 
| PersistableTransfer | ResumableTransfer | Supportata | 
| PauseResult<T> | Oggetto riutilizzabile direttamente | Non supportato | 

### Oggetti risultanti
<a name="s3-tm-migration-result-objects"></a>


| Classe V1 | Classe V2 | Stato migrazione | 
| --- | --- | --- | 
| CopyResult | CompletedCopy | Supportata | 
| UploadResult | CompletedUpload | Supportata | 

### Oggetti di configurazione
<a name="s3-tm-migration-configuration-objects"></a>


| Classe V1 | Classe V2 | Stato migrazione | 
| --- | --- | --- | 
| TransferManagerConfiguration | MultipartConfiguration(sul client Amazon S3) | Supportata | 
| TransferProgress | TransferProgress \$1 TransferProgressSnapshot | Supportato | 
| KeyFilter | DownloadFilter | Supportata | 

### Oggetti non supportati
<a name="s3-tm-migration-unsupported-objects"></a>


| Classe V1 | Alternativa V2 | Stato migrazione | 
| --- | --- | --- | 
| PauseStatus | Non supportata | Non supportato | 
| UploadContext | Non supportata | Non supportato | 
| ObjectCannedAclProvider | PutObjectRequest.builder().acl() | Non supportato | 
| ObjectMetadataProvider | PutObjectRequest.builder().metadata() | Non supportato | 
| ObjectTaggingProvider | PutObjectRequest.builder().tagging() | Non supportato | 
| PresignedUrlDownload | Non supportata | Non supportato | 

## TransferManagerBuilder migrazione della configurazione
<a name="s3-tm-migration-builder-configuration"></a>

### Modifiche di configurazione
<a name="migration-transfer-manager-config-changes"></a>

Le modifiche alla configurazione che devi impostare per il gestore di trasferimento v2 dipendono dal client S3 che utilizzi. Puoi scegliere tra il client S3 basato su AWS CRT o il client asincrono S3 standard basato su Java. Per informazioni sulle differenze, consulta l'argomento. [Client S3 in AWS SDK for Java 2.x](examples-s3.md#s3-clients)

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


****  

| Impostazione | v1 | v2 - Transfer Manager che utilizza un client S3 basato su AWS CRT | 
| --- | --- | --- | 
|    (procurati un costruttore)  |  <pre>TransferManagerBuilder tmBuilder = <br />   TransferManagerBuilder.standard();</pre>  |  <pre>S3TransferManager.Builder tmBuilder  = <br />  S3TransferManager.builder();</pre>  | 
|    client S3  |  <pre>tmBuilder.withS3Client(...);<br />tmBuilder.setS3Client(...);</pre>  |  <pre>tmBuilder.s3Client(...);</pre>  | 
|    Esecutore  |  <pre>tmBuilder.withExecutorFactory(...);<br />tmBuilder.setExecutorFactory(...);</pre>  |  <pre>tmBuilder.executor(...);</pre>  | 
|    Chiudi i pool di thread  |  <pre>tmBuilder.withShutDownThreadPools(...);<br />tmBuilder.setShutdownThreadPools(...);</pre>  | Non supportato. L'esecutore fornito non verrà spento quando viene chiuso S3TransferManager | 
|    Dimensione minima della parte da caricare  |  <pre>tmBuilder.withMinimumUploadPartSize(...);<br />tmBuilder.setMinimumUploadPartSize(...);</pre>  |  <pre>S3AsyncClient s3 = S3AsyncClient.crtBuilder().<br />      minimumPartSizeInBytes(...).build();<br /><br />tmBuilder.s3Client(s3);</pre>  | 
|    Soglia di caricamento in più parti  |  <pre>tmBuilder.withMultipartUploadThreshold(...);<br />tmBuilder.setMultipartUploadThreshold(...);</pre>  |  <pre>S3AsyncClient s3 = S3AsyncClient.crtBuilder().<br />      thresholdInBytes(...).build();<br /><br />tmBuilder.s3Client(s3);</pre>  | 
|    Dimensione minima della parte di copia  |  <pre>tmBuilder.withMultipartCopyPartSize(...);<br />tmBuilder.setMultipartCopyPartSize(...);</pre>  |  <pre>S3AsyncClient s3 = S3AsyncClient.crtBuilder().<br />      minimumPartSizeInBytes(...).build();<br /><br />tmBuilder.s3Client(s3);</pre>  | 
|    Soglia di copia multiparte  |  <pre>tmBuilder.withMultipartCopyThreshold(...);<br />tmBuilder.setMultipartCopyThreshold(...);</pre>  |  <pre>S3AsyncClient s3 = S3AsyncClient.crtBuilder().<br />      thresholdInBytes(...).build();<br /><br />tmBuilder.s3Client(s3);</pre>  | 
|    Disattiva i download paralleli  |  <pre>tmBuilder.withDisableParallelDownloads(...);<br />tmBuilder.setDisableParallelDownloads(...);</pre>  | Disabilita i download paralleli passando un client S3 standard basato su Java con multipart disabilitato (impostazione predefinita) al gestore di trasferimento.<pre>S3AsyncClient s3 =<br />   S3AsyncClient.builder().build();<br /><br />tmBuilder.s3Client(s3);</pre> | 
|    Calcola sempre md5 multipart  |  <pre>tmBuilder.withAlwaysCalculateMultipartMd5(...);<br />tmBuilder.setAlwaysCalculateMultipartMd5(...);</pre>  | Non supportato. | 

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


****  

| Impostazione | v1 | v2 - Transfer Manager che utilizza un client asincrono S3 basato su Java | 
| --- | --- | --- | 
|    (procurati un costruttore)  |  <pre>TransferManagerBuilder tmBuilder = <br />   TransferManagerBuilder.standard();</pre>  |  <pre>S3TransferManager.Builder tmBuilder  = <br />  S3TransferManager.builder();</pre>  | 
|    client S3  |  <pre>tmBuilder.withS3Client(...);<br />tmBuilder.setS3Client(...);</pre>  |  <pre>tmBuilder.s3Client(...);</pre>  | 
|    Esecutore  |  <pre>tmBuilder.withExecutorFactory(...);<br />tmBuilder.setExecutorFactory(...);</pre>  |  <pre>tmBuilder.executor(...);</pre>  | 
|    Chiudi i pool di thread  |  <pre>tmBuilder.withShutDownThreadPools(...);<br />tmBuilder.setShutdownThreadPools(...);</pre>  | Non supportato. L'esecutore fornito non verrà spento quando viene chiuso S3TransferManager | 
|    Dimensione minima della parte da caricare  |  <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>  | 
|    Soglia di caricamento in più parti  |  <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>  | 
|    Dimensione minima della parte di 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>  | 
|    Soglia di 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>  | 
|    Disattiva i download paralleli  |  <pre>tmBuilder.withDisableParallelDownloads(...);<br />tmBuilder.setDisableParallelDownloads(...);</pre>  | Disabilita i download paralleli passando un client S3 standard basato su Java con multipart disabilitato (impostazione predefinita) al gestore di trasferimento.<pre>S3AsyncClient s3 =<br />   S3AsyncClient.builder().build();<br /><br />tmBuilder.s3Client(s3);</pre> | 
|    Calcola sempre md5 multipart  |  <pre>tmBuilder.withAlwaysCalculateMultipartMd5(...);<br />tmBuilder.setAlwaysCalculateMultipartMd5(...);</pre>  | Non supportato. | 

------

## Modifiche del comportamento
<a name="s3-tm-migration-behavior-changes"></a>

### Operazioni asincrone
<a name="s3-tm-migration-async-operations"></a>

**V1 (blocco):**

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

**V2 (asincrono):**

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

### Gestione degli errori
<a name="s3-tm-migration-error-handling"></a>

**V1:** I trasferimenti di directory falliscono completamente se una richiesta secondaria fallisce.

**V2:** I trasferimenti di directory vengono completati correttamente anche se alcune richieste secondarie falliscono. Verifica la presenza di errori in modo esplicito:

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

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

### Download parallelo tramite recuperi a intervalli di byte
<a name="migration-transfer-manager-behavior-fetches"></a>

Quando la funzionalità di trasferimento parallelo automatico è abilitata nell'SDK v2, S3 Transfer Manager utilizza [recuperi a intervalli di byte](https://docs.aws.amazon.com/AmazonS3/latest/userguide/optimizing-performance-guidelines.html#optimizing-performance-guidelines-get-range) per recuperare parti specifiche dell'oggetto in parallelo (download multipart). Il modo in cui un oggetto viene scaricato con v2 non dipende da come l'oggetto è stato originariamente caricato. Tutti i download possono trarre vantaggio da un throughput e da una concorrenza elevati. 

Al contrario, con Transfer Manager della v1, è importante il modo in cui l'oggetto è stato originariamente caricato. Il v1 Transfer Manager recupera le parti dell'oggetto nello stesso modo in cui le parti sono state caricate. Se un oggetto è stato originariamente caricato come oggetto singolo, v1 Transfer Manager non è in grado di accelerare il processo di download utilizzando richieste secondarie.

# Modifiche nell'analisi di Amazon URIs S3 dalla versione 1 alla versione 2
<a name="migration-s3-uri-parser"></a>

Questo argomento descrive in dettaglio le modifiche apportate all'analisi di Amazon URIs S3 dalla versione 1 (v1) alla versione 2 (v2.).

## Modifiche di alto livello
<a name="migration-3-uri-parser-api-changes"></a>

Per iniziare ad analizzare un URI S3 nella v1, si crea un'istanza utilizzando un costruttore. `AmazonS3URI` Nella v2 si chiama un'istanza di, per `parseUri()` restituire un. `S3Utilities` `S3URI`


****  

| Modifica | v1 |   v2 | 
| --- | --- | --- | 
|    Dipendenze da Maven  |  <pre><dependencyManagement><br />    <dependencies><br />        <dependency><br />            <groupId>com.amazonaws</groupId><br />            <artifactId>aws-java-sdk-bom</artifactId><br />            <version>1.12.5871</version><br />            <type>pom</type><br />            <scope>import</scope><br />        </dependency><br />    </dependencies><br /></dependencyManagement><br /><dependencies><br />    <dependency>  <br />        <groupId>com.amazonaws</groupId><br />        <artifactId>s3</artifactId><br />    </dependency><br /></dependencies></pre>  |  <pre><dependencyManagement><br />    <dependencies><br />        <dependency><br />            <groupId>software.amazon.awssdk</groupId><br />            <artifactId>bom</artifactId><br />            <version>2.27.212</version><br />            <type>pom</type><br />            <scope>import</scope><br />        </dependency><br />    </dependencies><br /></dependencyManagement><br /><dependencies><br />    <dependency><br />        <groupId>software.amazon.awssdk</groupId><br />        <artifactId>s3</artifactId><br />    </dependency><br /></dependencies></pre>  | 
| Nome pacchetto | com.amazonaws.services.s3 | software.amazon.awssdk.services.s3 | 
| Nomi delle classi | [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 [Ultima versione](https://central.sonatype.com/artifact/com.amazonaws/aws-java-sdk-bom). 2 [Ultima versione](https://central.sonatype.com/artifact/software.amazon.awssdk/bom).

## Modifiche alle API
<a name="migration-3-uri-parser-api-changes"></a>


| Comportamento | v1 |   v2 | 
| --- | --- | --- | 
| Analizza un URI 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>  | 
| Recupera il nome del bucket da un URI S3. |  <pre>String bucket = s3Uri.getBucket();</pre>  |  <pre>Optional<String> bucket = s3Uri.bucket();</pre>  | 
| Recupera la chiave. |  <pre>String key = s3Uri.getKey();</pre>  |  <pre>Optional<String> key = s3Uri.key();</pre>  | 
| Recupera la regione. |  <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>  | 
|  Recupera se l'URI S3 è in stile percorso.  |  <pre>boolean isPathStyle = s3Uri.isPathStyle();</pre>  |  <pre>boolean isPathStyle = s3Uri.isPathStyle();</pre>  | 
| Recupera l'ID della versione. |  <pre>String versionId = s3Uri.getVersionId();</pre>  |  <pre>Optional<String> versionId = <br />    s3Uri.firstMatchingRawQueryParameter("versionId");</pre>  | 
| Recupera i parametri dell'interrogazione. | N/D |  <pre>Map<String, List<String>> queryParams =<br />    s3Uri.rawQueryParameters();</pre>  | 

### Modifiche del comportamento
<a name="migration-s3-uri-parser-behavior-changes"></a>

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

v1 offre la possibilità di inserire un flag per specificare se l'URI deve essere codificato come URL. Il valore predefinito è `true`. 

Nella v2, la codifica degli URL non è supportata. Se lavori con chiavi oggetto o parametri di query che contengono caratteri riservati o non sicuri, devi codificarli tramite URL. Ad esempio, è necessario sostituire uno spazio bianco `" "` con. `%20`

# Modifiche all'API S3 Event Notifications dalla versione 1 alla versione 2
<a name="migration-s3-event-notification"></a>

Questo argomento descrive in dettaglio le modifiche all'API S3 Event Notifications dalla versione 1.x (v1) alla versione 2 .x (v2) di. AWS SDK per Java

## Modifiche di alto livello
<a name="migration-s3-event-notification-hl"></a>

### Modifiche strutturali
<a name="migration-s3-event-notification-hl-struct"></a>

La V1 utilizza classi interne statiche per i `EventNotificationRecord` tipi e i relativi attributi, mentre la v2 utilizza classi pubbliche separate per `EventNotificationRecord` i tipi.

### Modifiche alla convenzione di denominazione
<a name="migration-s3-event-notification-hl-naming"></a>

*In v1, i nomi delle classi di attributi includono il suffisso *Entity*, mentre v2 omette questo suffisso per una denominazione più semplice: ad esempio, EventData anziché. *eventDataEntity**

## Modifiche nelle dipendenze, nei pacchetti e nei nomi delle classi
<a name="migration-s3-event-notification-deps"></a>

Nella v1, le classi API di notifica degli eventi S3 vengono importate in modo transitivo insieme al modulo S3 (artifactID). `aws-java-sdk-s3` Tuttavia, nella v2, è necessario aggiungere una dipendenza dall'artefatto. `s3-event-notifications`


****  

| Modifica | v1 |   v2 | 
| --- | --- | --- | 
|    Dipendenze da Maven  |  <pre><dependencyManagement><br />    <dependencies><br />        <dependency><br />            <groupId>com.amazonaws</groupId><br />            <artifactId>aws-java-sdk-bom</artifactId><br />            <version>1.X.X</version><br />            <type>pom</type><br />            <scope>import</scope><br />        </dependency><br />    </dependencies><br /></dependencyManagement><br /><dependencies><br />    <dependency><br />        <groupId>com.amazonaws</groupId><br />        <artifactId>aws-java-sdk-s3</artifactId><br />    </dependency><br /></dependencies></pre>  |  <pre><dependencyManagement><br />    <dependencies><br />        <dependency><br />            <groupId>software.amazon.awssdk</groupId><br />            <artifactId>bom</artifactId><br />            <version>2.X.X1</version><br />            <type>pom</type><br />            <scope>import</scope><br />        </dependency><br />    </dependencies><br /></dependencyManagement><br /><dependencies><br />    <dependency><br />        <groupId>software.amazon.awssdk</groupId><br />        <artifactId>s3-event-notifications</artifactId><br />    </dependency><br /></dependencies></pre>  | 
| Nome pacchetto | com.amazonaws.services.s3.event | software.amazon.awssdk.eventnotifications.s3.model | 
| Nomi delle classi |  [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 S3 EventNotification BucketEntity](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/event/S3EventNotification.S3BucketEntity.html) [Entità S3 EventNotification .S3](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/event/S3EventNotification.S3Entity.html) [S3 EventNotification S.3 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) [S3Bucket](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) [Oggetto 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 [Ultima versione](https://central.sonatype.com/artifact/software.amazon.awssdk/bom).

## Modifiche alle API
<a name="migration-s3-event-notification-API-changes"></a>

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


| Caso d’uso | v1 |   v2 | 
| --- | --- | --- | 
| Crea S3EventNotification da JSON String |  <pre>S3EventNotification notification = <br />        S3EventNotification.parseJson(message.body());</pre>  |  <pre>S3EventNotification notification = <br />        S3EventNotification.fromJson(message.body());</pre>  | 
| Converti in S3EventNotification stringa JSON |  <pre>String json = notification.toJson();</pre>  |  <pre>String json = notification.toJson();</pre>  | 

### Accedi agli attributi di `S3EventNotification`
<a name="migration-s3-event-notification-API-changes-attr"></a>


| Caso d’uso | v1 |   v2 | 
| --- | --- | --- | 
| Recuperare i record da una notifica |  <pre>List<S3EventNotification.S3EventNotificationRecord> records = <br />        notifcation.getRecords();</pre>  |  <pre>List<S3EventNotificationRecord> records = <br />        notification.getRecords();</pre>  | 
| Recuperare un record da un elenco di record |  <pre>S3EventNotification.S3EventNotificationRecord record = <br />        records.stream().findAny().get();</pre>  |  <pre>S3EventNotificationRecord record = <br />        records.stream().findAny().get();</pre>  | 
| Recupera i dati degli eventi Glacier |  <pre>S3EventNotification.GlacierEventDataEntity glacierEventData =<br />        record.getGlacierEventData();</pre>  |  <pre>GlacierEventData glacierEventData = <br />        record.getGlacierEventData();</pre>  | 
| Recupera i dati degli eventi di ripristino da un evento Glacier |  <pre>S3EventNotification.RestoreEventDataEntity restoreEventData = <br />        glacierEventData.getRestoreEventDataEntity();</pre>  |  <pre>RestoreEventData restoreEventData = <br />        glacierEventData.getRestoreEventData();</pre>  | 
| Recupera i parametri della richiesta |  <pre>S3EventNotification.RequestParametersEntity requestParameters = <br />        record.getRequestParameters();</pre>  |  <pre>RequestParameters requestParameters = <br />        record.getRequestParameters();</pre>  | 
| Recupera i dati degli eventi di Intelligent Tiering |  <pre>S3EventNotification.IntelligentTieringEventDataEntity tieringEventData = <br />        record.getIntelligentTieringEventData();</pre>  |  <pre>IntelligentTieringEventData intelligentTieringEventData = <br />        record.getIntelligentTieringEventData();</pre>  | 
| Recupera i dati degli eventi del ciclo di vita |  <pre>S3EventNotification.LifecycleEventDataEntity lifecycleEventData = <br />        record.getLifecycleEventData();</pre>  |  <pre>LifecycleEventData lifecycleEventData = <br />        record.getLifecycleEventData();</pre>  | 
| Recupera il nome dell'evento come enum |  <pre>S3Event eventNameAsEnum = record.getEventNameAsEnum();</pre>  |  <pre>//getEventNameAsEnum does not exist; use 'getEventName()'<br />String eventName = record.getEventName();</pre>  | 
| Recupera i dati degli eventi di replica |  <pre>S3EventNotification.ReplicationEventDataEntity replicationEntity = <br />        record.getReplicationEventDataEntity();</pre>  |  <pre>ReplicationEventData replicationEventData = <br />        record.getReplicationEventData();</pre>  | 
| Recupera le informazioni sul bucket e sull'oggetto S3 |  <pre>S3EventNotification.S3Entity s3 = record.getS3();</pre>  |  <pre>S3 s3 = record.getS3();</pre>  | 
| Recupera le informazioni sull'identità dell'utente |  <pre>S3EventNotification.UserIdentityEntity userIdentity = <br />        record.getUserIdentity();</pre>  |  <pre>UserIdentity userIdentity = <br />        record.getUserIdentity();</pre>  | 
| Recupera gli elementi di risposta |  <pre>S3EventNotification.ResponseElementsEntity responseElements = <br />        record.getResponseElements();</pre>  |  <pre>ResponseElements responseElements = <br />        record.getResponseElements();</pre>  | 

## Migra la versione della libreria `aws-lambda-java-events`
<a name="migration-s3-events-notification-lambda-lib"></a>

Se utilizzi eventi [aws-lambda-java-events](https://github.com/aws/aws-lambda-java-libs/tree/main/aws-lambda-java-events)di notifica S3 all'interno di una funzione Lambda, ti consigliamo di eseguire l'aggiornamento alla versione 3.x.x più recente. Le versioni recenti eliminano tutte le dipendenze da AWS SDK per Java 1.x dall'API di notifica degli eventi di S3.

Per ulteriori informazioni sulle differenze nella gestione delle notifiche degli eventi S3 tra la `aws-lambda-java-events` libreria e l'SDK for Java 2.x, consulta. [Elabora gli eventi S3 in Lambda con le librerie Java: e AWS SDK for Java 2.x `aws-lambda-java-events`](examples-s3-event-notifications.md#s3-event-notif-processing-options)

# Modifiche al file di profilo
<a name="migration-profile-file"></a>

 AWS SDK for Java 2.x Analizza le definizioni dei profili `~/.aws/config` e emula più `~/.aws/credentials` da vicino il modo in cui la AWS CLI analizza i file.

L'SDK per Java 2.x:
+ Risolve un `~/` OR `~` seguito dal separatore di percorso predefinito del file system all'inizio del percorso controllando, nell'ordine,, (solo Windows)`$HOME`, `$USERPROFILE` (solo Windows) e quindi la proprietà del sistema. `$HOMEDRIVE` `$HOMEPATH` `user.home`
+ Cerca la variabile di `AWS_SHARED_CREDENTIALS_FILE` ambiente anziché. `AWS_CREDENTIAL_PROFILES_FILE`
+ Elimina silenziosamente le definizioni dei profili nei file di configurazione senza la parola `profile` all'inizio del nome del profilo.
+ Elimina silenziosamente le definizioni di profilo che non sono costituite da caratteri alfanumerici, trattini bassi o trattini (dopo che la `profile` parola principale è stata rimossa dai file di configurazione).
+ Unisce le impostazioni delle definizioni dei profili duplicate all'interno dello stesso file.
+ Unisce le impostazioni delle definizioni dei profili duplicate nei file di configurazione e delle credenziali.
+ NON unisce le impostazioni se entrambe `[profile foo]` si `[foo]` trovano nello stesso file.
+ Utilizza le impostazioni `[profile foo]` se entrambe `[profile foo]` le impostazioni si `[foo]` trovano nel file di configurazione.
+ Utilizza il valore dell'ultima impostazione duplicata nello stesso file e profilo.
+ Riconosce entrambi `;` e `#` per definire un commento.
+ Riconosce `;` e `#` nelle definizioni del profilo definisce un commento, anche se i caratteri sono adiacenti alla parentesi di chiusura.
+ Riconosce `;` e `#` definisce un commento solo nell'impostazione dei valori solo se sono preceduti da spazi bianchi.
+ Riconosce `;` `#` e tutti i contenuti seguenti nell'impostazione dei valori se non sono preceduti da spazi bianchi.
+ Considera le credenziali basate sui ruoli le credenziali con la massima priorità. L'SDK 2.x utilizza sempre credenziali basate sui ruoli se l'utente specifica la proprietà. `role_arn`
+ Considera le credenziali basate sulla sessione come credenziali. second-highest-priority L'SDK 2.x utilizza sempre credenziali basate sulla sessione se non sono state utilizzate credenziali basate sui ruoli e l'utente specifica le proprietà and. `aws_access_key_id` `aws_session_token`
+ Utilizza le credenziali di base se non vengono utilizzate credenziali basate sul ruolo e sulla sessione e l'utente ha specificato la proprietà. `aws_access_key_id`

# Variabili di ambiente e modifiche alle proprietà del sistema
<a name="migration-env-and-system-props"></a>


| 1.x Variabile di ambiente | 1.x Proprietà del sistema | Variabile d'ambiente 2.x | Proprietà di 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 | Non supportato ([funzionalità di richiesta](https://github.com/aws/aws-sdk-java-v2/issues/new)) | Non supportato ([funzionalità di richiesta](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
|   | com.amazonaws.sdk.enableDefaultMetrics | [Non supportata](https://github.com/aws/aws-sdk-java-v2/issues/23) | [Non supportato](https://github.com/aws/aws-sdk-java-v2/issues/23) | 
|   | com.amazonaws.sdk.enableThrottledRetry | [Non supportato](https://github.com/aws/aws-sdk-java-v2/issues/645) | [Non supportato](https://github.com/aws/aws-sdk-java-v2/issues/645) | 
|   | com.amazonaws.regions.RegionUtils.fileOverride | Non supportato ([funzionalità di richiesta](https://github.com/aws/aws-sdk-java-v2/issues/new)) | Non supportato ([funzionalità di richiesta](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
|   | com.amazonaws.regions.RegionUtils.disableRemote | Non supportato ([funzionalità di richiesta](https://github.com/aws/aws-sdk-java-v2/issues/new)) | Non supportato ([funzionalità di richiesta](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
|   | com.amazonaws.services.s3.disableImplicitGlobalClients | Non supportato ([funzionalità di richiesta](https://github.com/aws/aws-sdk-java-v2/issues/new)) | Non supportato ([funzionalità di richiesta](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
|   | com.amazonaws.sdk.enableInRegionOptimizedMode | Non supportato ([funzionalità di richiesta](https://github.com/aws/aws-sdk-java-v2/issues/new)) | Non supportato ([funzionalità di richiesta](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 

# Modifiche in Waiters dalla versione 1 alla versione 2
<a name="migration-waiters"></a>

Questo argomento descrive in dettaglio le modifiche alla funzionalità di Waiters dalla versione 1 (v1) alla versione 2 (v2).

Le tabelle seguenti mostrano la differenza in particolare per i camerieri di DynamoDB. I camerieri di altri servizi seguono lo stesso schema.

## Modifiche di alto livello
<a name="migration-waiters-api-changes"></a>

Le lezioni per camerieri si svolgono nello stesso oggetto Maven del servizio. 


| Modifica | v1 |  v2 | 
| --- | --- | --- | 
|    Dipendenze da Maven  |  <pre><dependencyManagement><br />    <dependencies><br />        <dependency><br />            <groupId>com.amazonaws</groupId><br />            <artifactId>aws-java-sdk-bom</artifactId><br />            <version>1.12.6801</version><br />            <type>pom</type><br />            <scope>import</scope><br />        </dependency><br />    </dependencies><br /></dependencyManagement><br /><dependencies><br />    <dependency><br />        <groupId>com.amazonaws</groupId><br />        <artifactId>dynamodb</artifactId><br />    </dependency><br /></dependencies><br /></pre>  |  <pre><dependencyManagement><br />    <dependencies><br />        <dependency><br />            <groupId>software.amazon.awssdk</groupId><br />            <artifactId>bom</artifactId><br />            <version>2.27.102</version><br />            <type>pom</type><br />            <scope>import</scope><br />        </dependency><br />    </dependencies><br /></dependencyManagement><br /><dependencies><br />    <dependency><br />        <groupId>software.amazon.awssdk</groupId><br />        <artifactId>dynamodb</artifactId><br />    </dependency><br /></dependencies></pre>  | 
| Nome pacchetto | com.amazonaws.services.dynamodbv2.waiters | software.amazon.awssdk.services.dynamodb.waiters | 
| Nomi delle classi |  `[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/it_it/sdk-for-java/latest/developer-guide/migration-waiters.html)  | 

1 Ultima versione[.](https://central.sonatype.com/artifact/com.amazonaws/aws-java-sdk-bom) 2 [Ultima versione](https://central.sonatype.com/artifact/software.amazon.awssdk/bom).

## Modifiche alle API
<a name="migration-cf-presign-behavior-changes"></a>


| Modifica | v1 |  v2 | 
| --- | --- | --- | 
| Crea un cameriere |  <pre>AmazonDynamoDB client = AmazonDynamoDBClientBuilder <br />                            .standard().build();<br />AmazonDynamoDBWaiters waiter = client.waiters();</pre>  | Sincrono:<pre>DynamoDbClient client = DynamoDbClient.create();<br />DynamoDbWaiter waiter = client.waiter();</pre>Asincrono:<pre>DynamoDbAsyncClient asyncClient = <br />        DynamoDbAsyncClient.create();<br />DynamoDbAsyncWaiter waiter = asyncClient.waiter();</pre> | 
| Attendi che esista una tabella | Sincrono:<pre>waiter.tableExists()<br />    .run(new WaiterParameters<>(<br />        new DescribeTableRequest(tableName)));</pre>Asincrono:<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> |  Sincrono: <pre>WaiterResponse<DescribeTableResponse> waiterResponse =<br />    waiter.waitUntilTableExists(<br />        r -> r.tableName("myTable"));<br />waiterResponse.matched().response()<br />       .ifPresent(System.out::println);</pre> Asincrono: <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>  | 

## Modifiche di configurazione
<a name="migration-waiters-config"></a>


| Modifica | v1 |  v2 | 
| --- | --- | --- | 
| Strategia di sondaggio (numero massimo di tentativi e ritardo fisso) |  <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>  | 

# Modifiche nell'utilità per i metadati EC2 dalla versione 1 alla versione 2
<a name="migration-imds"></a>

Questo argomento descrive in dettaglio le modifiche all'utilità di metadati SDK for Java Amazon Elastic Compute Cloud (EC2) dalla versione 1 (v1) alla versione 2 (v2).

## Modifiche di alto livello
<a name="migration-imds-high-level-changes"></a>


****  

| Modifica | v1 |   v2 | 
| --- | --- | --- | 
|    Dipendenze da Maven  |  <pre><dependencyManagement><br />    <dependencies><br />        <dependency><br />            <groupId>com.amazonaws</groupId><br />            <artifactId>aws-java-sdk-bom</artifactId><br />            <version>1.12.5871</version><br />            <type>pom</type><br />            <scope>import</scope><br />        </dependency><br />    </dependencies><br /></dependencyManagement><br /><dependencies><br />    <dependency><br />        <groupId>com.amazonaws</groupId><br />        <artifactId>aws-java-sdk-core</artifactId><br />    </dependency><br /></dependencies></pre>  |  <pre><dependencyManagement><br />    <dependencies><br />        <dependency><br />            <groupId>software.amazon.awssdk</groupId><br />            <artifactId>bom</artifactId><br />            <version>2.27.212</version><br />            <type>pom</type><br />            <scope>import</scope><br />        </dependency><br />    </dependencies><br /></dependencyManagement><br /><dependencies><br />    <dependency><br />        <groupId>software.amazon.awssdk</groupId><br />        <artifactId>imds</artifactId><br />    </dependency><br />    <dependency><br />        <groupId>software.amazon.awssdk</groupId><br />        <artifactId>apache-client3</artifactId><br />    </dependency><br /></dependencies></pre>  | 
| Nome pacchetto |  com.amazonaws.util  |  software.amazon.awssdk.imds  | 
| Approccio all'istanziazione |  Utilizza metodi di utilità statici; nessuna istanziazione: <pre>String localHostName = <br />           EC2MetadataUtils.getLocalHostName();</pre>  |  Usa un metodo di fabbrica statico: <pre>Ec2MetadataClient client = Ec2MetadataClient.create();</pre> Oppure usa un approccio da costruttore: <pre>Ec2MetadataClient client = Ec2MetadataClient.builder()<br />    .endpointMode(EndpointMode.IPV6)<br />    .build();</pre>  | 
| Tipi di clienti | Metodi di utilità solo sincroni: EC2MetadataUtils |  Sincrono: `Ec2MetadataClient` Asincrono: `Ec2MetadataAsyncClient`  | 

1 Ultima versione[.](https://central.sonatype.com/artifact/com.amazonaws/aws-java-sdk-bom) 2 [Ultima versione](https://central.sonatype.com/artifact/software.amazon.awssdk/bom).

3 Notate la dichiarazione del `apache-client` modulo per la v2. La versione 2 dell'utilità per i metadati EC2 richiede l'implementazione dell'interfaccia per il client di metadati sincrono o dell'`SdkHttpClient`interfaccia per il client di metadati asincrono. `SdkAsyncHttpClient` La [Configurare i client HTTP in AWS SDK for Java 2.x](http-configuration.md) sezione mostra l'elenco dei client HTTP che è possibile utilizzare.

### Richiesta di metadati
<a name="migration-imds-fetching-changes"></a>

Nella v1, si utilizzano metodi statici che non accettano parametri per richiedere i metadati per una risorsa EC2. Al contrario, è necessario specificare il percorso della risorsa EC2 come parametro nella v2. La tabella seguente mostra i diversi approcci.


****  

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

Fai riferimento alle [categorie di metadati delle istanze](https://docs.aws.amazon.com//AWSEC2/latest/UserGuide/instancedata-data-categories.html) per trovare il percorso da fornire per richiedere una parte di metadati. 

**Nota**  
Quando utilizzi un client di metadati di istanza nella v2, dovresti mirare a utilizzare lo stesso client per tutte le richieste di recupero dei metadati.

 

## Modifiche del comportamento
<a name="migration-imds-behavior-changes"></a>

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

Su EC2, l'Instance Metadata Service (IMDS) in esecuzione locale restituisce alcuni metadati come stringhe in formato JSON. [Uno di questi esempi sono i metadati dinamici di un documento di identità di istanza.](https://docs.aws.amazon.com//AWSEC2/latest/UserGuide/instance-identity-documents.html)

L'API v1 contiene metodi separati per ogni parte dei metadati di identità dell'istanza, mentre l'API v2 restituisce direttamente la stringa JSON. Per lavorare con la stringa JSON, puoi utilizzare l'[API Document](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/core/document/package-summary.html) per analizzare la risposta e navigare nella struttura JSON.

La tabella seguente confronta il modo in cui recuperi i metadati di un documento di identità di istanza in v1 e v2.


****  

| Caso d’uso | v1 |   v2 | 
| --- | --- | --- | 
| Recupera la regione |  <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 l'id dell'istanza |  <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 il tipo di istanza |  <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>  | 

### Differenze di risoluzione degli endpoint
<a name="migration-imds-behavior-endpoint-res"></a>

La tabella seguente mostra le posizioni controllate dall'SDK per risolvere l'endpoint in IMDS. Le posizioni sono elencate con priorità decrescente.


****  

| v1 |   v2 | 
| --- | --- | 
| Proprietà del sistema: com.amazonaws.sdk.ec2MetadataServiceEndpointOverride | Metodo di configurazione di Client Builder: endpoint(...) | 
| Variabile d'ambiente: AWS\$1EC2\$1METADATA\$1SERVICE\$1ENDPOINT | Proprietà del sistema: aws.ec2MetadataServiceEndpoint | 
| Valore predefinito: http://169.254.169.254 | File di configurazione: \$1.aws/config con l'impostazione ec2\$1metadata\$1service\$1endpoint | 
|  | Valore associato a risolto endpoint-mode  | 
|  | Valore predefinito: http://169.254.169.254 | 

### Risoluzione dell'endpoint in v2
<a name="migration-imds-behavior-endpoint-res2"></a>

Quando imposti esplicitamente un endpoint utilizzando il builder, quel valore dell'endpoint ha la priorità su tutte le altre impostazioni. Quando viene eseguito il codice seguente, la proprietà di `aws.ec2MetadataServiceEndpoint` sistema e l'`ec2_metadata_service_endpoint`impostazione del file di configurazione vengono ignorate, se esistono.

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

#### modalità Endpoint
<a name="migration-imds-behavior-endpoint-mode"></a>

Con la v2, puoi specificare una modalità endpoint per configurare il client di metadati in modo che utilizzi i valori di endpoint predefiniti per o. IPv4 IPv6 La modalità endpoint non è disponibile per la versione 1. Il valore predefinito utilizzato per è e for IPv4 . `http://169.254.169.254` `http://[fd00:ec2::254]` IPv6

La tabella seguente mostra i diversi modi in cui è possibile impostare la modalità endpoint in ordine di priorità decrescente.


****  

|  |  | Valori possibili | 
| --- | --- | --- | 
| Metodo di configurazione di Client Builder: endpointMode(...) |  <pre>Ec2MetadataClient client = Ec2MetadataClient<br />  .builder()<br />  .endpointMode(EndpointMode.IPV4)<br />  .build();</pre>  | EndpointMode.IPV4, EndpointMode.IPV6 | 
| Proprietà del sistema | aws.ec2MetadataServiceEndpointMode | IPv4, IPv6 (il caso non ha importanza) | 
| File di configurazione: \$1.aws/config | ec2\$1metadata\$1service\$1endpointImpostazione  | IPv4, IPv6 (il caso non ha importanza) | 
| Non specificato nei modi precedenti | IPv4 è usato |  | 

#### Come si risolve `endpoint` l'SDK o nella v2 `endpoint-mode`
<a name="migration-imds-behavior-endpoint-res2-which"></a>

1. L'SDK utilizza il valore impostato nel codice nel client builder e ignora qualsiasi impostazione esterna. Poiché l'SDK genera un'eccezione se entrambi `endpoint` `endpointMode` vengono chiamati sul client builder, l'SDK utilizza il valore dell'endpoint indipendentemente dal metodo utilizzato.

1. Se non imposti un valore nel codice, l'SDK esamina la configurazione esterna, prima per le proprietà del sistema e poi per un'impostazione nel file di configurazione. 

   1. L'SDK verifica innanzitutto il valore di un endpoint. Se viene trovato un valore, viene utilizzato. 

   1. Se l'SDK non ha ancora trovato un valore, l'SDK cerca le impostazioni della modalità endpoint.

1. Infine, se l'SDK non trova impostazioni esterne e non hai configurato il client di metadati nel codice, l'SDK utilizza il valore di. IPv4 `http://169.254.169.254`

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

Amazon EC2 definisce due approcci per accedere ai metadati delle istanze:
+ Instance Metadata Service versione 1 (IMDSv1): approccio di richiesta/risposta
+ Instance Metadata Service Version 2 ()IMDSv2: approccio orientato alla sessione

La tabella seguente confronta il modo in cui Java SDKs funziona con IMDS.


****  

| v1 |   v2 | 
| --- | --- | 
| IMDSv2 viene utilizzato per impostazione predefinita | Usa sempre IMDSv2 | 
| Tenta di recuperare un token di sessione per ogni richiesta e torna indietro IMDSv1 se non riesce a recuperare un token di sessione | Mantiene un token di sessione in una cache interna che viene riutilizzata per più richieste | 

L'SDK for Java 2.x supporta IMDSv2 solo e non ricorre a. IMDSv1

## Differenze di configurazione
<a name="migration-imds-config-diffs"></a>

La tabella seguente elenca le diverse opzioni di configurazione.


****  

| Configurazione | v1 |   v2 | 
| --- | --- | --- | 
| Tentativi | Configurazione non disponibile | Configurabile tramite il metodo builder retryPolicy(...) | 
| HTTP | Timeout di connessione configurabile tramite la variabile di ambiente. AWS\$1METADATA\$1SERVICE\$1TIMEOUT L'impostazione predefinita è 1 secondo. | Configurazione disponibile passando un client HTTP al metodo httpClient(...) builder. Il timeout di connessione predefinito per i client HTTP è di 2 secondi. | 

### Esempio di configurazione HTTP v2
<a name="migration-imds-http-conf-v2-ex"></a>

L'esempio seguente mostra come configurare il client di metadati. Questo esempio configura il timeout della connessione e utilizza il client HTTP Apache.

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

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

# Modifiche nella CloudFront preassegnazione di Amazon dalla versione 1 alla versione 2
<a name="migration-cloudfront-presigning"></a>

Questo argomento descrive in dettaglio le modifiche in Amazon CloudFront dalla versione 1 (v1) alla versione 2 (v2).

## Modifiche di alto livello
<a name="migration-cloudfront-presigning-api-changes"></a>


****  

| Modifica | v1 |   v2 | 
| --- | --- | --- | 
|    Dipendenze da Maven  |  <pre><dependencyManagement><br />    <dependencies><br />        <dependency><br />            <groupId>com.amazonaws</groupId><br />            <artifactId>aws-java-sdk-bom</artifactId><br />            <version>1.12.5871</version><br />            <type>pom</type><br />            <scope>import</scope><br />        </dependency><br />    </dependencies><br /></dependencyManagement><br /><dependencies><br />    <dependency>  <br />        <groupId>com.amazonaws</groupId><br />        <artifactId>cloudfront</artifactId><br />    </dependency><br /></dependencies></pre>  |  <pre><dependencyManagement><br />    <dependencies><br />        <dependency><br />            <groupId>software.amazon.awssdk</groupId><br />            <artifactId>bom</artifactId><br />            <version>2.27.212</version><br />            <type>pom</type><br />            <scope>import</scope><br />        </dependency><br />    </dependencies><br /></dependencyManagement><br /><dependencies><br />    <dependency><br />        <groupId>software.amazon.awssdk</groupId><br />        <artifactId>cloudfront</artifactId><br />    </dependency><br /></dependencies></pre>  | 
| Nome pacchetto | com.amazonaws.services.cloudfront | software.amazon.awssdk.services.cloudfront | 
| Nomi delle classi |  [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 [Ultima versione](https://central.sonatype.com/artifact/com.amazonaws/aws-java-sdk-bom). 2 [Ultima versione](https://central.sonatype.com/artifact/software.amazon.awssdk/bom).

## Modifiche alle API
<a name="migration-cf-presign-behavior-changes"></a>


| Comportamento | v1 |   v2 | 
| --- | --- | --- | 
| Crea una richiesta predefinita | Gli argomenti vengono passati direttamente all'API. |  <pre>CannedSignerRequest cannedRequest =<br />      CannedSignerRequest.builder()<br />                         .resourceUrl(resourceUrl)<br />                         .privateKey(privateKey)<br />                         .keyPairId(keyPairId)<br />                         .expirationDate(expirationDate)<br />                         .build();</pre>  | 
| Crea una richiesta personalizzata | Gli argomenti vengono passati direttamente all'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>  | 
| Genera un URL firmato (predefinito) |  <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>  | 
| Genera un cookie firmato (personalizzato) |  <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>  | 

### Intestazioni dei cookie rifattorizzate nella v2
<a name="migration-cf-presign-behavior-headers"></a>

In Java v1, Java SDK fornisce le intestazioni dei cookie come file. `Map.Entry<String, String>`

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

L'SDK Java v2 fornisce l'intera intestazione come singola. `String`

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

# Modifiche nell'API IAM Policy Builder dalla versione 1 alla versione 2
<a name="migration-iam-policy-builder"></a>

Questo argomento descrive in dettaglio le modifiche all'API IAM Policy Builder dalla versione 1 (v1) alla versione 2 (v2).

## Modifiche di alto livello
<a name="migration-iam-policy-builder-high-level"></a>


****  

| Modifica | v1 |   v2 | 
| --- | --- | --- | 
|    Dipendenze da Maven  |  <pre><dependencyManagement><br />    <dependencies><br />        <dependency><br />            <groupId>com.amazonaws</groupId><br />            <artifactId>aws-java-sdk-bom</artifactId><br />            <version>1.12.5871</version><br />            <type>pom</type><br />            <scope>import</scope><br />        </dependency><br />    </dependencies><br /></dependencyManagement><br /><dependencies><br />    <dependency><br />        <groupId>com.amazonaws</groupId><br />        <artifactId>aws-java-sdk-core</artifactId><br />    </dependency><br /></dependencies></pre>  |  <pre><dependencyManagement><br />    <dependencies><br />        <dependency><br />            <groupId>software.amazon.awssdk</groupId><br />            <artifactId>bom</artifactId><br />            <version>2.27.212</version><br />            <type>pom</type><br />            <scope>import</scope><br />        </dependency><br />    </dependencies><br /></dependencyManagement><br /><dependencies><br />    <dependency><br />        <groupId>software.amazon.awssdk</groupId><br />        <artifactId>iam-policy-builder</artifactId><br />    </dependency><br /></dependencies></pre>  | 
| Nome pacchetto | com.amazonaws.auth.policy | software.amazon.awssdk.policybuilder.iam | 
| Nomi delle classi |  [Policy](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/policy/Policy.html) [Statement](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/it_it/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/it_it/sdk-for-java/latest/developer-guide/migration-iam-policy-builder.html)  | 

1 Ultima versione[.](https://central.sonatype.com/artifact/com.amazonaws/aws-java-sdk-bom) 2 [Ultima versione](https://central.sonatype.com/artifact/software.amazon.awssdk/bom).

## Modifiche alle API
<a name="migration-iam-policy-builder-api"></a>


****  

| Impostazione | v1 |   v2 | 
| --- | --- | --- | 
|  Crea un'istanza di una politica |  <pre>Policy policy = new Policy();</pre>  |  <pre>IamPolicy.Builder policyBuilder = IamPolicy.builder();<br />...<br />IamPolicy policy = policyBuilder.build();</pre>  | 
|    Imposta id  |  <pre>policy.withtId(...);<br />policy.setId(...);</pre>  |  <pre>policyBuilder.id(...);</pre>  | 
|    Impostare la versione  | N/A: utilizza la versione predefinita di 2012-10-17 |  <pre>policyBuilder.version(...);</pre>  | 
|    Crea una dichiarazione  |  <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>  | 
|    Imposta dichiarazione  |  <pre>policy.withStatements(statement);<br />policy.setStatements(statement);</pre>  |  <pre>policyBuilder.addStatement(statement);</pre>  | 

## Differenze nella creazione di una dichiarazione
<a name="migration-iam-policy-builder-statement"></a>

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

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

L'SDK v1 dispone [`enum`di tipi di](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/policy/Action.html) azioni di servizio che rappresentano `[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)` elementi di una dichiarazione politica. I seguenti `enum` tipi sono alcuni esempi.
+ `[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)`

L'esempio seguente mostra la `SendMessage` costante for`SQSActions`.

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

Non è possibile specificare 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)` elemento in un'istruzione in v1.

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

Nella v2, l'[IamAction](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/policybuilder/iam/IamAction.html)interfaccia rappresenta tutte le azioni. Per specificare un elemento di [azione specifico del servizio](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_action.html), passate una stringa al `create` metodo come illustrato nel codice seguente.

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

È possibile specificare un'istruzione `[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)` for a con v2, come illustrato nel codice seguente.

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

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

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

Per rappresentare le condizioni delle dichiarazioni, l'SDK v1 utilizza sottoclassi di. [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)

Ogni `Condition` sottoclasse definisce un `enum` tipo di confronto per aiutare a definire la condizione. Ad esempio, quanto segue mostra un [confronto di stringhe](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String) *non simile* per una condizione.

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

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

Nella v2, si crea una condizione per una dichiarazione politica utilizzando `[IamCondition](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/policybuilder/iam/IamCondition.html)` e fornendo un`[IamConditionOperator](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/policybuilder/iam/IamConditionOperator.html)`, che contiene `enums` per tutti i tipi.

```
IamCondition condition = IamCondition.create(IamConditionOperator.STRING_NOT_LIKE, "key", "value");
```

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

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

L'`[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)`elemento di una dichiarazione politica è rappresentato dalla classe dell'SDK. `[Resource](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/policy/Resource.html)` L'ARN viene fornito come stringa nel costruttore. Le seguenti sottoclassi forniscono costruttori di convenienza.
+ [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)
+ [SQSQueueRisorsa](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/policy/resources/SQSQueueResource.html)

Nella v1, è possibile specificare un `[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)` elemento per a `[Resource](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/policy/Resource.html)` chiamando il `withIsNotType` metodo come illustrato nella seguente istruzione.

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

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

Nella v2, si crea un `[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)` elemento passando un ARN al `IamResource.create` metodo.

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

An `[IamResource](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/policybuilder/iam/IamResource.html)` può essere impostato come *[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)*elemento come mostrato nel frammento seguente.

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

`IamResource.ALL`rappresenta tutte le risorse. 

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

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

L'SDK v1 offre le seguenti `[Principal](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/policy/Principal.html)` classi per rappresentare i tipi di principali che includono tutti i membri:
+ `AllUsers`
+ `AllServices`
+ `AllWebProviders`
+ `All`

Non è possibile aggiungere un `[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)` elemento a un'istruzione.

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

Nella v2, `IamPrincipal.ALL` rappresenta tutti i principali:

Per rappresentare tutti i membri in altri tipi di principali, usa `[IamPrincipalType](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/policybuilder/iam/IamPrincipalType.html)` le classi quando crei un. `IamPrincipal`
+ `IamPrincipal.create(IamPrincipalType.AWS,"*")`per tutti gli utenti.
+ `IamPrincipal.create(IamPrincipalType.SERVICE,"*")`per tutti i servizi.
+ `IamPrincipal.create(IamPrincipalType.FEDERATED,"*")`per tutti i provider web.
+ `IamPrincipal.create(IamPrincipalType.CANONICAL_USER,"*")`per tutti gli utenti canonici.

È possibile utilizzare il `addNotPrincipal` metodo per rappresentare un `[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)` elemento quando si crea una dichiarazione politica, come illustrato nella seguente dichiarazione.

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

# Modifiche nell'utilizzo di DynamoDB dalla versione 1 alla versione 2 del AWS SDK per Java
<a name="migration-ddb-mapper"></a>



**Topics**
+ [Differenze delle API di mappatura DynamoDB tra la versione 1 e la versione 2 di AWS SDK per Java](ddb-mapping.md)
+ [Documenta le differenze delle API tra la versione 1 e la versione 2 di AWS SDK per Java](dynamodb-mapping-document-api.md)
+ [Migrazione della libreria di crittografia](ddb-encryption-lib-migrate.md)

# Differenze delle API di mappatura DynamoDB tra la versione 1 e la versione 2 di AWS SDK per Java
<a name="ddb-mapping"></a>

La APIs mappatura di DynamoDB è cambiata in modo significativo tra la versione 1 e la versione 2 di. AWS SDK per Java Nella versione 1, si utilizza `DynamoDBMapper` per lavorare con Java. POJOs Nella versione 2, si utilizza `DynamoDbEnhancedClient` con nomi dei metodi aggiornati, opzioni di definizione dello schema avanzate e una maggiore sicurezza dei tipi.

Le differenze principali includono:
+ Nuovi nomi dei metodi (ad esempio, `getItem` invece di`load`)
+ Creazione esplicita dello schema di tabella
+ Supporto integrato per operazioni sincrone e asincrone
+ Modifiche nella modalità di gestione delle stringhe e della configurazione vuote

Questa sezione descrive le modifiche all'API di mappatura, le differenze nelle annotazioni, gli aggiornamenti di configurazione e le linee guida alla migrazione per aiutarti nella transizione dalla v1 alla `DynamoDBMapper` v2. `DynamoDbEnhancedClient`

**Contents**
+ [Modifiche di alto livello nelle librerie di mappatura dalla versione 1 alla versione 2 dell'SDK for Java](dynamodb-mapping-high-level.md)
  + [Importa le differenze di dipendenza](dynamodb-mapping-high-level.md#dynamodb-mapping-deps)
+ [Modifiche nella APIs mappatura di DynamoDB tra la versione 1 e la versione 2 dell'SDK for Java](dynamodb-mapping-api-changes.md)
  + [Crea un cliente](dynamodb-mapping-api-changes.md#dynamodb-mapping-api-changes-client)
  + [Stabilire la mappatura alla tabella/indice DynamoDB](dynamodb-mapping-api-changes.md#dynamodb-mapping-api-changes-mapping)
  + [Operazioni sulle tabelle](dynamodb-mapping-api-changes.md#dynamodb-mapping-api-changes-tobleops)
  + [Classi e proprietà della mappa](dynamodb-mapping-api-changes.md#dynamodb-mapping-schemas)
    + [Annotazioni Bean](dynamodb-mapping-api-changes.md#dynamodb-mapping-schemas-annos)
    + [Annotazioni aggiuntive V2](dynamodb-mapping-api-changes.md#dynamodb-mapping-schemas-annos-v2-addnl)
  + [Configurazione](dynamodb-mapping-api-changes.md#dynamodb-mapping-configuration)
    + [Configurazione per operazione](dynamodb-mapping-api-changes.md#dynamodb-mapping-configuration-per-op)
  + [Condizionali](dynamodb-mapping-api-changes.md#dynamodb-mapping-conditionals)
  + [Conversione del tipo](dynamodb-mapping-api-changes.md#dynamodb-mapping-type-conv)
    + [Convertitori predefiniti](dynamodb-mapping-api-changes.md#dynamodb-mapping-type-conv-defaults)
    + [Imposta un convertitore personalizzato per un attributo](dynamodb-mapping-api-changes.md#dynamodb-mapping-type-conv-anno)
    + [Aggiungi una fabbrica o un fornitore di convertitori di tipi](dynamodb-mapping-api-changes.md#dynamodb-mapping-type-conv-factory)
+ [Differenze nella gestione delle stringhe tra la versione 1 e la versione 2 dell'SDK for Java](dynamodb-migration-string-handling.md)
+ [Differenze di blocco ottimistiche tra la versione 1 e la versione 2 dell'SDK for Java](dynamodb-migrate-optimstic-locking.md)
+ [Fluent setter: differenze tra la versione 1 e la versione 2 dell'SDK for Java](dynamodb-migrate-fluent-setters.md)

# Modifiche di alto livello nelle librerie di mappatura dalla versione 1 alla versione 2 dell'SDK for Java
<a name="dynamodb-mapping-high-level"></a>

I nomi del client di mappatura in ciascuna libreria differiscono in V1 e V2:
+ V1 - Dinamo DBMapper
+ V2 - Client avanzato per DynamoDB

Interagisci con le due librerie più o meno allo stesso modo: crei un'istanza mapper/client e poi fornisci un POJO Java a APIs chi legge e scrive questi elementi nelle tabelle DynamoDB. Entrambe le librerie offrono anche annotazioni per la classe del POJO per indicare il modo in cui il client gestisce il POJO. 

Le differenze notevoli quando si passa alla V2 includono:
+ V2 e V1 utilizzano nomi di metodi diversi per le operazioni DynamoDB di basso livello. Esempio:    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/it_it/sdk-for-java/latest/developer-guide/dynamodb-mapping-high-level.html)
+ V2 offre diversi modi per definire schemi di tabelle e POJOs mapparli su tabelle. Puoi scegliere tra l'uso di annotazioni o uno schema generato dal codice utilizzando un builder. V2 offre anche versioni mutabili e immutabili degli schemi.
+ Con V2, si crea specificamente lo schema della tabella come uno dei primi passaggi, mentre in V1, lo schema della tabella viene dedotto dalla classe annotata secondo necessità.
+ [La V2 include il client [Document API nell'API client](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/enhanced/dynamodb/document/EnhancedDocument.html) avanzata, mentre la V1 utilizza un'API separata.](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/document/DynamoDB.html)
+ Tutti APIs sono disponibili nelle versioni sincrone e asincrone in V2.

Consulta la sezione sulla [mappatura di DynamoDB](dynamodb-enhanced-client.md) in questa guida per informazioni più dettagliate sul client avanzato V2.

## Importa le differenze di dipendenza
<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 [Ultima versione](https://central.sonatype.com/artifact/software.amazon.awssdk/bom).

Nella V1, una singola dipendenza include sia l'API DynamoDB di basso livello che l'API, mentre nella V2, si utilizza mapping/document `dynamodb-enhanced` la dipendenza degli artefatti per accedere all'API. mapping/document Il `dynamodb-enhanced` modulo contiene una dipendenza transitiva dal modulo di basso livello. `dynamodb` 

# Modifiche nella APIs mappatura di DynamoDB tra la versione 1 e la versione 2 dell'SDK for Java
<a name="dynamodb-mapping-api-changes"></a>

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


****  

| Caso d’uso | V1 | V2 | 
| --- | --- | --- | 
|   Istanziazione normale  |  <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>  | 
|   Istanziazione minima  |  <pre>AmazonDynamoDB standardClient = AmazonDynamoDBClientBuilder.standard();<br />DynamoDBMapper mapper = new DynamoDBMapper(standardClient);</pre>  |  <pre>DynamoDbEnhancedClient enhancedClient = DynamoDbEnhancedClient.create();</pre>  | 
|   Con trasformatore di attributi \$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>  | 

\$1 Le estensioni in V2 corrispondono all'incirca ai trasformatori di attributi in V1. La [Usa le estensioni per personalizzare le operazioni di DynamoDB Enhanced Client](ddb-en-client-extensions.md) sezione contiene ulteriori informazioni sulle estensioni in V2. 

## Stabilire la mappatura alla tabella/indice DynamoDB
<a name="dynamodb-mapping-api-changes-mapping"></a>

Nella V1, si specifica il nome di una tabella DynamoDB tramite un'annotazione bean. Nella V2, un metodo factory`table()`, produce un'istanza `DynamoDbTable` che rappresenta la tabella DynamoDB remota. Il primo parametro del `table()` metodo è il nome della tabella DynamoDB.


****  

| Caso d’uso | V1 | V2 | 
| --- | --- | --- | 
|   Mappa la classe Java POJO sulla tabella 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>  | 
|   Mappare su un indice secondario DynamoDB  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/it_it/sdk-for-java/latest/developer-guide/dynamodb-mapping-api-changes.html) La sezione della DynamoDB Developer Guide che [illustra il metodo `query` V1](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBMapper.Methods.html#DynamoDBMapper.Methods.query) mostra un esempio completo.  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/it_it/sdk-for-java/latest/developer-guide/dynamodb-mapping-api-changes.html) La [Usa indici secondari](ddb-en-client-use-secindex.md) sezione di questa guida fornisce ulteriori informazioni.  | 

## Operazioni sulle tabelle
<a name="dynamodb-mapping-api-changes-tobleops"></a>

Questa sezione descrive le operazioni APIs che differiscono tra V1 e V2 per la maggior parte dei casi d'uso standard. 

Nella V2, tutte le operazioni che coinvolgono una singola tabella vengono chiamate sull'`DynamoDbTable`istanza, non sul client avanzato. Il client avanzato contiene metodi che possono indirizzare più tabelle. 

Nella *tabella denominata Table operations* riportata di seguito, un'istanza POJO viene definita come `item` o come un tipo specifico come`customer1`. Per gli esempi V2, le istanze denominate `table` sono il risultato di una chiamata precedente `enhancedClient.table()` che restituisce un riferimento all'istanza. `DynamoDbTable`

Tieni presente che la maggior parte delle operazioni V2 può essere richiamata con uno schema di consumo fluido anche se non vengono visualizzate. Ad esempio, 

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

Per le operazioni V1, *Table operations* (di seguito) contiene alcuni dei moduli più comunemente usati e non tutti i moduli sovraccaricati. Ad esempio, il `load()` metodo presenta i seguenti sovraccarichi:

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

*Le operazioni della tabella* (di seguito) mostrano i moduli più comunemente usati:

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


**Operazioni sulle tabelle**  

| Caso d’uso | V1 | V2 | 
| --- | --- | --- | 
|  Scrivere un Java POJO su una tabella DynamoDB Operazione **DynamoDB:**, `PutItem` `UpdateItem`  |  <pre>mapper.save(item)<br />mapper.save(item, config)<br />mapper.save(item, saveExpression, config)</pre> Nella V1, `DynamoDBMapperConfig.SaveBehavior` and annotations determina quale metodo DynamoDB di basso livello verrà chiamato. In generale, `UpdateItem` viene chiamato tranne quando si usa and. `SaveBehavior.CLOBBER` `SaveBehavior.PUT` Le chiavi generate automaticamente sono un caso d'uso speciale e occasionalmente `UpdateItem` vengono utilizzate entrambe`PutItem`.  |  <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>  | 
|  Leggere un elemento da una tabella DynamoDB a un Java POJO **Funzionamento 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>  | 
|  Eliminare un elemento da una tabella DynamoDB **Funzionamento DynamoDB:** `DeleteItem`  |  <pre>mapper.delete(item, deleteExpression, config)</pre>  |  <pre>table.deleteItem(deleteItemRequest)<br />table.deleteItem(item)<br />table.deleteItem(key)</pre>  | 
|  Interroga una tabella o un indice secondario DynamoDB e restituisci un elenco impaginato **Funzionamento 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> Usa il valore restituito `PageIterable.stream()` (lazy loading) per le risposte di sincronizzazione e `PagePublisher.subscribe()` per le risposte asincrone  | 
|  Interroga una tabella o un indice secondario DynamoDB e restituisci un elenco **Funzionamento 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> Usa il valore restituito `PageIterable.items()` (lazy loading) per le risposte di sincronizzazione e `PagePublisher.items.subscribe()` per le risposte asincrone  | 
|  Scansiona una tabella o un indice secondario DynamoDB e restituisci un elenco impaginato **Funzionamento 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> Usa il valore restituito `PageIterable.stream()` (lazy loading) per le risposte di sincronizzazione e `PagePublisher.subscribe()` per le risposte asincrone  | 
|  Scansiona una tabella o un indice secondario DynamoDB e restituisci un elenco **Funzionamento 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> Usa il valore restituito `PageIterable.items()` (lazy loading) per le risposte di sincronizzazione e `PagePublisher.items.subscribe()` per le risposte asincrone  | 
|  Leggi più elementi da più tabelle in un batch **Funzionamento 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>  | 
|  Scrivi più elementi su più tabelle in un batch **Funzionamento 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>  | 
|  Eliminare più elementi da più tabelle in un batch **Funzionamento 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>  | 
|  Scrittura/elimina più elementi in un batch **Funzionamento 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>  | 
|  Eseguire una scrittura transazionale **Funzionamento DynamoDB:** `TransactWriteItems`  |  <pre>mapper.transactionWrite(transactionWriteRequest)</pre>  |  <pre>enhancedClient.transactWriteItems(transasctWriteItemsRequest)</pre>  | 
|  Effettuare una lettura transazionale **Funzionamento DynamoDB:** `TransactGetItems`  |  <pre>mapper.transactionLoad(transactionLoadRequest)</pre>  |  <pre>enhancedClient.transactGetItems(transactGetItemsRequest) </pre>  | 
|  Ottieni un conteggio degli elementi corrispondenti di una query Funzionamento **DynamoDB:** con `Query` `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>  | 
|  Ottieni un conteggio degli elementi corrispondenti di una scansione Funzionamento **DynamoDB:** con `Scan` `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>  | 
|  Crea una tabella in DynamoDB corrispondente alla classe POJO **Funzionamento DynamoDB:** `CreateTable`  |  <pre>mapper.generateCreateTableRequest(Customer.class)</pre> L'istruzione precedente genera una richiesta di creazione della tabella di basso livello; gli utenti devono chiamare `createTable` il client 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>  | 
|  Esegui una scansione parallela in DynamoDB **`Scan`Funzionamento DynamoDB:** con e parametri `Segment` `TotalSegments`  |  <pre>mapper.parallelScan(Customer.class, <br />                    scanExpression, <br />                    numTotalSegments)</pre>  |  Gli utenti devono gestire i thread di lavoro e le chiamate `scan` per ogni segmento: <pre>table.scan(r -> r.segment(0).totalSegments(5))</pre>  | 
|  Integra Amazon S3 con DynamoDB per archiviare collegamenti S3 intelligenti  |  <pre>mapper.createS3Link(bucket, key)<br />mapper.getS3ClientCache()</pre>  |  Non è supportato perché abbina Amazon S3 e DynamoDB.  | 

## Classi e proprietà della mappa
<a name="dynamodb-mapping-schemas"></a>

Sia in V1 che in V2, si mappano le classi alle tabelle utilizzando annotazioni in stile bean. V2 offre anche [altri modi per definire schemi per casi d'uso specifici, come](ddb-en-client-adv-features.md#ddb-en-client-adv-features-schm-overview) lavorare con classi immutabili.

### Annotazioni Bean
<a name="dynamodb-mapping-schemas-annos"></a>

La tabella seguente mostra le annotazioni bean equivalenti per un caso d'uso specifico utilizzate in V1 e V2. Uno scenario `Customer` di classe viene utilizzato per illustrare i parametri.

Le annotazioni, così come le classi e le enumerazioni, in V2 seguono la convenzione camel case e utilizzano '', non 'DynamoDB'. DynamoDb


| Caso d’uso | V1 | V2 | 
| --- | --- | --- | 
| Mappa la classe sulla tabella |  <pre>@DynamoDBTable (tableName ="CustomerTable")</pre>  | <pre>@DynamoDbBean<br />@DynamoDbBean(converterProviders = {...})</pre>Il nome della tabella viene definito quando si chiama il DynamoDbEnhancedClient\$1table() metodo. | 
| Designate un membro della classe come attributo della tabella  |  <pre>@DynamoDBAttribute(attributeName = "customerName")</pre>  |  <pre>@DynamoDbAttribute("customerName") </pre>  | 
| Designare un membro della classe è una chiave hash/partition  |  <pre>@DynamoDBHashKey </pre>  |  <pre>@DynamoDbPartitionKey</pre>  | 
| Designare un membro della classe è fondamentale range/sort  |  <pre>@DynamoDBRangeKey </pre>  |  <pre>@DynamoDbSortKey </pre>  | 
| Designare un membro della classe come chiave di hash/partizione dell'indice secondaria |  <pre>@DynamoDBIndexHashKey </pre>  |  <pre>@DynamoDbSecondaryPartitionKey </pre>  | 
| Designare un membro della classe come chiave di ordinamento/intervallo di indice secondaria |  <pre>@DynamoDBIndexRangeKey </pre>  |  <pre>@DynamoDbSecondarySortKey </pre>  | 
| Ignora questo membro della classe durante la mappatura su una tabella |  <pre>@DynamoDBIgnore </pre>  |  <pre>@DynamoDbIgnore</pre>  | 
| Designare un membro della classe come attributo chiave UUID generato automaticamente |  <pre>@DynamoDBAutoGeneratedKey</pre>  |  <pre>@DynamoDbAutoGeneratedUuid </pre> L'estensione che lo fornisce non viene caricata per impostazione predefinita; è necessario aggiungere l'estensione a client builder.  | 
| Designare un membro della classe come attributo timestamp generato automaticamente |  <pre>@DynamoDBAutoGeneratedTimestamp</pre>  |  <pre>@DynamoDbAutoGeneratedTimestampAttribute</pre> L'estensione che lo fornisce non viene caricata per impostazione predefinita; è necessario aggiungere l'estensione a client builder.  | 
| Designare un membro della classe come attributo di versione con incremento automatico |  <pre>@DynamoDBVersionAttribute</pre>  |  <pre>@DynamoDbVersionAttribute</pre> L'estensione che lo fornisce viene caricata automaticamente.  | 
| Designate un membro della classe come richiedente una conversione personalizzata |  <pre>@DynamoDBTypeConverted</pre>  |  <pre>@DynamoDbConvertedBy</pre>  | 
| Designate un membro della classe da memorizzare come tipo di attributo diverso |  <pre>@DynamoDBTyped(<DynamoDBAttributeType>)</pre>  |  Usa un'`AttributeConverter`implementazione. V2 offre molti convertitori integrati per i tipi Java più comuni. Puoi anche implementare il tuo file personalizzato `AttributeConverter` o. `AttributeConverterProvider` Vedi [Controlla la conversione degli attributi](ddb-en-client-adv-features-conversion.md) in questa guida.  | 
| Designare una classe che può essere serializzata in un documento DynamoDB (documento in stile JSON) o in un documento secondario  |  <pre>@DynamoDBDocument</pre>  | Utilizzate l'API Enhanced Document. Consulta le seguenti risorse:[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/it_it/sdk-for-java/latest/developer-guide/dynamodb-mapping-api-changes.html) | 

### Annotazioni aggiuntive V2
<a name="dynamodb-mapping-schemas-annos-v2-addnl"></a>


| Caso d’uso | V1 | V2 | 
| --- | --- | --- | 
| Designate un membro della classe da non memorizzare come attributo NULL se il valore Java è nullo | N/D |  <pre>@DynamoDbIgnoreNulls</pre>  | 
| Designate un membro della classe come oggetto vuoto se tutti gli attributi sono nulli | N/D |  <pre>@DynamoDbPreserveEmptyObject</pre>  | 
| Designate un'azione speciale di aggiornamento per un membro della classe | N/D |  <pre>@DynamoDbUpdateBehavior</pre>  | 
| Designate una classe immutabile | N/D |  <pre>@DynamoDbImmutable</pre>  | 
| Designare un membro della classe come attributo del contatore ad incremento automatico | N/D |  <pre>@DynamoDbAtomicCounter</pre> L'estensione che fornisce questa funzionalità viene caricata automaticamente.  | 

## Configurazione
<a name="dynamodb-mapping-configuration"></a>

Nella V1, in genere si controllano comportamenti specifici utilizzando un'istanza di. `DynamoDBMapperConfig` È possibile fornire l'oggetto di configurazione quando si crea il mapper o quando si effettua una richiesta. In V2, la configurazione è specifica dell'oggetto di richiesta per l'operazione.


| Caso d’uso | V1 | Impostazione predefinita in V1 | V2 | 
| --- | --- | --- | --- | 
|  |  <pre>DynamoDBMapperConfig.builder()</pre>  |  |  | 
| Strategia di load/write ripetizione dei tentativi in batch |  <pre>  .withBatchLoadRetryStrategy(loadRetryStrategy)</pre> <pre>  .withBatchWriteRetryStrategy(writeRetryStrategy)</pre>  | Riprova gli elementi non riusciti | Configura la strategia di riprova sul dispositivo sottostante. DynamoDBClient Vedi [Configurare il comportamento dei tentativi in AWS SDK for Java 2.x](retry-strategy.md) in questa guida. | 
| Letture coerenti |  <pre>  .withConsistentReads(CONSISTENT)</pre>  | EVENTUAL | Per impostazione predefinita, le letture coerenti sono false per le operazioni di lettura. Sostituisci con .consistentRead(true) sull'oggetto della richiesta. | 
| Schema di conversione con set di marshallers/unmarshallers |  <pre>  .withConversionSchema(conversionSchema)</pre> Le implementazioni statiche forniscono la retrocompatibilità con le versioni precedenti.  | V2\$1COMPATIBLE | Non applicabile. Si tratta di una funzionalità legacy che si riferisce al modo in cui le versioni precedenti di DynamoDB (V1) memorizzavano i tipi di dati e questo comportamento non verrà mantenuto nel client avanzato. Un esempio di comportamento in DynamoDB V1 è l'archiviazione dei valori booleani come numero anziché come booleano. | 
| Nomi delle tabelle |  <pre>  .withObjectTableNameResolver()<br />  .withTableNameOverride() <br />  .withTableNameResolver()</pre> Le implementazioni statiche forniscono la retrocompatibilità con le versioni precedenti  | usa annotation o guess from class |  Il nome della tabella viene definito quando si chiama il `DynamoDbEnhancedClient#table()` metodo.  | 
| Strategia di caricamento della paginazione |  <pre>  .withPaginationLoadingStrategy(strategy)</pre>  Le opzioni sono: LAZY\$1`LOADING`, o `EAGER_LOADING` `ITERATION_ONLY`  | LAZY\$1LOADING |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/it_it/sdk-for-java/latest/developer-guide/dynamodb-mapping-api-changes.html)  | 
| Richiedi la raccolta delle metriche |  <pre>  .withRequestMetricCollector(collector)</pre>  | null | Da utilizzare metricPublisher() ClientOverrideConfiguration durante la creazione del client DynamoDB standard.  | 
| Salva il comportamento |  <pre>  .withSaveBehavior(SaveBehavior.CLOBBER) </pre> Le opzioni sono `UPDATE``CLOBBER`,`PUT`,`APPEND_SET`, o`UPDATE_SKIP_NULL_ATTRIBUTES`.  | UPDATE |  In V2, si chiama `putItem()` or in `updateItem()` modo esplicito. `CLOBBER or PUT`: L'azione corrispondente nella v 2 è la chiamata. `putItem()` Non esiste una `CLOBBER` configurazione specifica. `UPDATE`: Corrisponde a `updateItem()` `UPDATE_SKIP_NULL_ATTRIBUTES`: Corrisponde a`updateItem()`. Controlla il comportamento di aggiornamento con l'impostazione della richiesta `ignoreNulls` e l'annotazione/tag`DynamoDbUpdateBehavior`. `APPEND_SET`: non supportato  | 
| Tipo: fabbrica di convertitori |  <pre>  .withTypeConverterFactory(typeConverterFactory) </pre>  | convertitori di tipo standard |  Impostare sul fagiolo utilizzando <pre>@DynamoDbBean(converterProviders = {ConverterProvider.class, <br />        DefaultAttributeConverterProvider.class})</pre>  | 

### Configurazione per operazione
<a name="dynamodb-mapping-configuration-per-op"></a>

In V1, alcune operazioni, ad esempio`query()`, sono altamente configurabili tramite un oggetto «espressione» inviato all'operazione. Esempio:

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

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

In V2, invece di utilizzare un oggetto di configurazione, si impostano i parametri sull'oggetto di richiesta utilizzando un builder. Esempio:

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

customerTable.query(emailBw);
```

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

In V2, le espressioni condizionali e di filtraggio vengono espresse utilizzando un `Expression` oggetto, che incapsula la condizione e la mappatura di nomi e filtri. 


| Caso d’uso | Operazioni | V1 | V2 | 
| --- | --- | --- | --- | 
| Condizioni previste per gli attributi | save (), delete (), query (), scan () |  <pre>new DynamoDBSaveExpression()<br />  .withExpected(Collections.singletonMap(<br />      "otherAttribute", new ExpectedAttributeValue(false)))<br />  .withConditionalOperator(ConditionalOperator.AND);</pre>  | Obsoleto; da usare al suo posto. ConditionExpression | 
| Espressione condizionale | 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>  | 
| Espressione filtro | interrogazione (), scansione () |  <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>  | 
| Espressione di condizione per la query | interrogazione () |  <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>  | 

## Conversione del tipo
<a name="dynamodb-mapping-type-conv"></a>

### Convertitori predefiniti
<a name="dynamodb-mapping-type-conv-defaults"></a>

Nella versione 2, l'SDK fornisce un set di convertitori predefiniti per tutti i tipi più comuni. È possibile modificare i convertitori di tipo sia a livello generale del provider che per un singolo attributo. Puoi trovare un elenco dei convertitori disponibili nel riferimento [AttributeConverter](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/enhanced/dynamodb/AttributeConverter.html)API.

### Imposta un convertitore personalizzato per un attributo
<a name="dynamodb-mapping-type-conv-anno"></a>

Nella V1, è possibile annotare un metodo getter con `@DynamoDBTypeConverted` per specificare la classe che esegue la conversione tra il tipo di attributo Java e un tipo di attributo DynamoDB. Ad esempio, è possibile applicare una stringa `CurrencyFormatConverter` che converte tra un `Currency` tipo Java e una stringa DynamoDB come mostrato nel seguente frammento.

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

L'equivalente V2 dello snippet precedente è mostrato di seguito.

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

**Nota**  
In V1, puoi applicare l'annotazione all'attributo stesso, a un tipo o a un'annotazione definita dall'utente, V2 supporta l'applicazione dell'annotazione solo al getter.

### Aggiungi una fabbrica o un fornitore di convertitori di tipi
<a name="dynamodb-mapping-type-conv-factory"></a>

Nella V1, puoi fornire il tuo set di convertitori di tipo o sostituire i tipi che ti interessano aggiungendo una fabbrica di convertitori di tipo alla configurazione. Il type converter factory si estende e `DynamoDBTypeConverterFactory` le sostituzioni vengono eseguite ottenendo un riferimento al set predefinito ed estendendolo. Il seguente frammento mostra come eseguire questa operazione.

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

V2 offre funzionalità simili tramite l'annotazione. `@DynamoDbBean` È possibile fornire una singola `AttributeConverterProvider` o una catena di messaggi ordinati`AttributeConverterProvider`. Tieni presente che se fornisci la tua catena di fornitori di convertitori di attributi, sostituirai il fornitore di convertitori predefinito e dovrai includerlo nella catena per utilizzare i suoi convertitori di attributi. 

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

La sezione sulla [conversione degli attributi di](ddb-en-client-adv-features-conversion.md#ddb-en-client-adv-features-conversion-example) questa guida contiene un esempio completo per V2.

# Differenze nella gestione delle stringhe tra la versione 1 e la versione 2 dell'SDK for Java
<a name="dynamodb-migration-string-handling"></a>

V1 e V2 gestiscono le stringhe vuote in modo diverso quando inviano dati a DynamoDB:
+ **V1**: converte le stringhe vuote in valori nulli prima di inviarle a DynamoDB (con conseguente assenza di attributo)
+ **V2**: invia stringhe vuote come valori effettivi di stringhe vuote a DynamoDB

**Importante**  
Dopo la migrazione alla V2, se non desideri che stringhe vuote vengano archiviate in DynamoDB, devi implementare convertitori personalizzati. Senza convertitori personalizzati, V2 memorizza le stringhe vuote come attributi di stringa vuota effettivi negli elementi DynamoDB, il che differisce dal comportamento della V1 di omettere completamente questi attributi.

**Example convertitore personalizzato per V2 che converte un attributo di stringa vuoto in null**  

```
/**
 * 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;
    }
}
```



# Differenze di blocco ottimistiche tra la versione 1 e la versione 2 dell'SDK for Java
<a name="dynamodb-migrate-optimstic-locking"></a>

Sia la V1 che la V2 implementano il blocco ottimistico con un'annotazione di attributo che contrassegna una proprietà sulla classe bean per memorizzare il numero di versione.


**Differenze nel comportamento di blocco ottimistico**  

|  | V1 | V2 | 
| --- | --- | --- | 
| Annotazione della classe Bean | @DynamoDBVersionAttribute | @DynamoDbVersionAttribute(nota che V2 usa una «b» minuscola) | 
| Salvataggio iniziale | Attributo del numero di versione impostato su 1. |  Il valore iniziale per l'attributo di versione impostato con`@DynamoDbVersionAttribute(startAt = X)`. Il valore predefinito è 0.  | 
| Aggiorna | L'attributo del numero di versione viene incrementato di 1 se il controllo condizionale verifica che il numero di versione dell'oggetto da aggiornare corrisponda al numero nel database. |  L'attributo del numero di versione viene incrementato se il controllo condizionale verifica che il numero di versione dell'oggetto da aggiornare corrisponda al numero nel database. L'attributo del numero di versione incrementato dall'opzione impostata con. `incrementBy` `@DynamoDbVersionAttribute(incrementBy = X)` Il valore predefinito è 1.  | 
| Elimina | DynamoDBMapperaggiunge un controllo condizionale che il numero di versione dell'oggetto da eliminare corrisponda al numero di versione nel database. |  V2 non aggiunge automaticamente condizioni per le operazioni di eliminazione. È necessario aggiungere manualmente le espressioni di condizione se si desidera controllare il comportamento di eliminazione. Nell'esempio seguente `recordVersion` è riportato l'attributo version 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>  | 
| Scrittura transazionale con controllo delle condizioni | Non è possibile utilizzare una classe bean con annotazioni @DynamoDBVersionAttribute in un metodo. addConditionCheck | È possibile utilizzare una classe bean con l'@DynamoDbVersionAttributeannotazione in un metodo addConditionCheck builder per una richiesta. transactWriteItems | 
| Disabilita | Disabilita il blocco ottimistico modificando il valore di  DynamoDBMapperConfig.SaveBehavior enumerazione da a. UPDATE CLOBBER |  Non utilizzare l'annotazione. `@DynamoDbVersionAttribute`  | 

# Fluent setter: differenze tra la versione 1 e la versione 2 dell'SDK for Java
<a name="dynamodb-migrate-fluent-setters"></a>

È possibile utilizzarlo POJOs con i setter fluenti nell'API di mappatura DynamoDB per V1 e con V2 a partire dalla versione 2.30.29. 

Ad esempio, il seguente POJO restituisce un'istanza del metodo: `Customer` `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;
  }
}
```

Tuttavia, se si utilizza una versione della V2 precedente alla 2.30.29, `setName` restituisce un'`Customer`istanza con un valore di. `name` `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.
  }
}
```

# Documenta le differenze delle API tra la versione 1 e la versione 2 di AWS SDK per Java
<a name="dynamodb-mapping-document-api"></a>

L'API Document supporta l'utilizzo di documenti in stile JSON come elementi singoli in una tabella DynamoDB. L'API Document V1 ha un'API corrispondente nella V2, ma invece di utilizzare un client separato per l'API dei documenti come nella V1, la V2 incorpora le funzionalità dell'API dei documenti nel client avanzato DynamoDB. 

In V1, la [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)classe rappresenta un record non strutturato da una tabella DynamoDB. In V2, un record non strutturato è rappresentato da un'istanza della classe. [https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/enhanced/dynamodb/document/EnhancedDocument.html](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/enhanced/dynamodb/document/EnhancedDocument.html) Nota che le chiavi primarie sono definite nello schema della tabella per V2 e sull'elemento stesso in V1.

La tabella seguente confronta le differenze tra il Documento APIs in V1 e V2.


| Caso d’uso | V1 | V2 | 
| --- |--- |--- |
| Crea un client per documenti |  <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>  | 
| Fai riferimento a una tabella |  <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** | 
| --- |
| Put Item |  <pre>Item item = new Item()<br />      .withPrimaryKey("id", 50)<br />      .withString("firstName", "Shirley");<br />PutItemOutcome outcome = documentTable.putItem(item);</pre>  |  <pre>EnhancedDocument personDocument = EnhancedDocument.builder()<br />        .putNumber("id", 50)<br />        .putString("firstName", "Shirley")<br />        .build();<br />documentTable.putItem(personDocument);</pre>  | 
| Get Item |  <pre>GetItemOutcome outcome = documentTable.getItemOutcome( "id", 50);<br />Item personDocFromDb = outcome.getItem();<br />String firstName = personDocFromDb.getString("firstName");<br /></pre>  |  <pre>EnhancedDocument personDocFromDb = documentTable<br />        .getItem(Key.builder()<br />            .partitionValue(50)<br />            .build()); <br />String firstName = personDocFromDb.getString("firstName");<br /></pre>  | 
| **Work with JSON items** | 
| --- |
| Converti una struttura JSON per usarla con l'API Document |  <pre>// The 'jsonPerson' identifier is a JSON string. <br />Item item = new Item().fromJSON(jsonPerson);</pre>  |  <pre>// The 'jsonPerson' identifier is a JSON string.<br />EnhancedDocument document = EnhancedDocument.builder()<br />        .json(jsonPerson).build());</pre>  | 
| Inserisci JSON |  <pre>documentTable.putItem(item)</pre>  |  <pre>documentTable.putItem(document);</pre>  | 
| Leggi 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>  | 

## Riferimento all'API e guide per il documento APIs
<a name="dynamodb-mapping-document-api-ref"></a>


|  | V1 | V2 | 
| --- | --- | --- | 
| Guida di riferimento alle API | [Documentazione di riferimento dell'API](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/document/package-summary.html) | [Documentazione di riferimento dell'API](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/enhanced/dynamodb/document/package-summary.html) | 
| Guida alla documentazione | [Guida per gli sviluppatori di Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/JavaDocumentAPIItemCRUD.html) | [Enhanced Document API](ddb-en-client-doc-api.md) (questa guida) | 

# Da API V1 Xpec a API V2 Expressions
<a name="ddb-v1-xspec-migrate"></a>

L'API Expression Specification (Xspec) disponibile nella V1 che consente di creare espressioni per l'utilizzo di dati orientati ai documenti non è disponibile nella V2. V2 utilizza l'API Expression, che funziona sia con dati orientati ai documenti che con dati mappati. object-to-item


****  

|  | V1 | V2 | 
| --- | --- | --- | 
| Nome API | API per la specificazione delle espressioni (Xspec) | API di espressione | 
| Funziona con | [Metodi della classe Document API [Table](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/document/Table.html) come [UpdateItem](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/document/Table.html#updateItem-java.lang.String-java.lang.Object-com.amazonaws.services.dynamodbv2.xspec.UpdateItemExpressionSpec-) e scan](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/document/Table.html#scan-com.amazonaws.services.dynamodbv2.xspec.ScanExpressionSpec-) |  Entrambi i APIs DynamoDB Enhanced Client: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/it_it/sdk-for-java/latest/developer-guide/ddb-v1-xspec-migrate.html) Per entrambi i tipi di APIs, dopo aver acquisito un'istanza: [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) [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/it_it/sdk-for-java/latest/developer-guide/ddb-v1-xspec-migrate.html) si utilizzano espressioni nei `DynamoDbTable` metodi quando si creano oggetti di richiesta. Ad esempio nel `filterExpression` metodo di [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)  | 
| Resources |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/it_it/sdk-for-java/latest/developer-guide/ddb-v1-xspec-migrate.html)  | [Informazioni sulle espressioni](ddb-en-client-expressions.md) in questa Guida per sviluppatori Java | 

# Migrazione della libreria di crittografia
<a name="ddb-encryption-lib-migrate"></a>

Per informazioni sulla migrazione della libreria di crittografia per far funzionare DynamoDB con la versione 2 dell'SDK Java, consulta la [Amazon DynamoDB](https://docs.aws.amazon.com/database-encryption-sdk/latest/devguide/ddb-java-migrate.html) Encryption Client Developer Guide.

# Modifiche al batching automatico delle richieste Amazon SQS dalla versione 1 alla versione 2
<a name="migration-sqs-auto-batching"></a>

Questo argomento descrive in dettaglio le modifiche al batching automatico delle richieste per Amazon SQS tra la versione 1 e la versione 2 di. AWS SDK per Java

## Modifiche di alto livello
<a name="migration-sqs-auto-batching-high-level-changes"></a>

La versione AWS SDK per Java 1.x esegue il buffering lato client utilizzando una `[AmazonSQSBufferedAsyncClient](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/sqs/buffered/AmazonSQSBufferedAsyncClient.html)` classe separata che richiede l'inizializzazione esplicita per il batching delle richieste. 

 AWS SDK for Java 2.x Semplifica e migliora la funzionalità di buffering con. `[SqsAsyncBatchManager](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/sqs/batchmanager/SqsAsyncBatchManager.html)` L'implementazione di questa interfaccia fornisce funzionalità di raggruppamento automatico delle richieste direttamente integrate con lo standard. `[SqsAsyncClient](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/sqs/SqsAsyncClient.html)` Per ulteriori informazioni sulle versioni 2`SqsAsyncBatchManager`, consulta l'[Utilizza il batching automatico delle richieste per Amazon SQS con AWS SDK for Java 2.x](sqs-auto-batch.md)argomento di questa guida.


| Modifica | v1 |   v2 | 
| --- | --- | --- | 
|    Dipendenze da 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>  | 
| Nomi dei pacchetti | com.amazonaws.services.sqs.buffered | software.amazon.awssdk.services.sqs.batchmanager | 
| Nomi delle classi |  `[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 [Ultima versione](https://central.sonatype.com/artifact/com.amazonaws/aws-java-sdk-bom). 2 [Ultima versione](https://central.sonatype.com/artifact/software.amazon.awssdk/bom).

## Utilizzo del batching automatico delle richieste SQS
<a name="migration-sqs-auto-batching-using"></a>


| Modifica | v1 |   v2 | 
| --- | --- | --- | 
| Crea un gestore di batch |  <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>  | 
| Crea un gestore di batch con configurazione personalizzata |  <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>  | 
| Inviare messaggi |  <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>  | 
| Eliminare messaggi |  <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>  | 
| Modificare la visibilità dei messaggi |  <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>  | 
| Ricevere messaggi |  <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>  | 

## Differenze tra i tipi di restituzione asincrona
<a name="migration-sqs-auto-batching-asyc-return-type"></a>


| Modifica | v1 |   v2 | 
| --- | --- | --- | 
| Tipo restituito | Future<ResultType> | CompletableFuture<ResponseType> | 
| Meccanismo di callback | Richiede un comando AsyncHandler con metodi onSuccess e onError separati | Usi CompletableFuture APIs forniti dal JDK, ad esempiowhenComplete(), thenCompose() thenApply() | 
| Gestione dell'eccezione | Utilizza il metodo AsyncHandler\$1onError() | Usi CompletableFuture APIs forniti dal JDK, ad esempioexceptionally(), o handle() whenComplete() | 
| Annullamento | Supporto di base tramite Future.cancel() | L'annullamento di un genitore annulla CompletableFuture automaticamente tutti i future a carico della catena | 

## Completamento asincrono, gestione delle differenze
<a name="migration-sqs-auto-batching-asyc-completion-handling"></a>


| Modifica | v1 |   v2 | 
| --- | --- | --- | 
| Implementazione del gestore di risposte |  <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>  | 

## Parametri di configurazione chiave
<a name="migration-sqs-auto-batching-params"></a>


****  

| Parametro | v1 |   v2 | 
| --- | --- | --- | 
| Dimensione massima batch | maxBatchSize(impostazione predefinita: 10 richieste per batch) | maxBatchSize(impostazione predefinita: 10 richieste per batch) | 
| Tempo di attesa in batch | maxBatchOpenMs(impostazione predefinita 200 ms) | sendRequestFrequency(impostazione predefinita 200 ms) | 
| Timeout di visibilità | visibilityTimeoutSeconds(-1 per impostazione predefinita della coda) | receiveMessageVisibilityTimeout(impostazione predefinita della coda) | 
| Tempo di attesa minimo | longPollWaitTimeoutSeconds(20 secondi quando longPoll è vero) | receiveMessageMinWaitDuration(impostazione predefinita 50 ms) | 
| Attributi di messaggio | Imposta utilizzando ReceiveMessageRequest | receiveMessageAttributeNames(nessuna per impostazione predefinita) | 
| Attributi di sistema | Imposta utilizzando ReceiveMessageRequest | receiveMessageSystemAttributeNames(nessuna per impostazione predefinita) | 
| Sondaggi lunghi | longPoll(l'impostazione predefinita è true) | Non supportata per evitare connessioni aperte in attesa dell'invio dei messaggi da parte del server | 
| Tempo di attesa massimo per sondaggi lunghi | longPollWaitTimeoutSeconds(impostazione predefinita: 20 secondi) | Non supportata per evitare connessioni aperte in attesa dell'invio dei messaggi da parte del server | 
| Numero massimo di batch di ricezione preimpostati archiviati sul lato client | maxDoneReceiveBatches(10 lotti) | Non supportato perché è gestito internamente | 
| Numero massimo di batch attivi in uscita elaborati contemporaneamente | maxInflightOutboundBatches(impostazione predefinita: 5 batch) | Non supportato perché è gestito internamente | 
| Numero massimo di batch di ricezione attivi elaborati contemporaneamente | maxInflightReceiveBatches(impostazione predefinita: 10 batch) | Non supportato perché è gestito internamente | 

# Usa l'SDK per Java 1.x e 2.x side-by-side
<a name="migration-side-by-side"></a>

È possibile utilizzare entrambe le versioni di AWS SDK per Java nei propri progetti.

Di seguito viene mostrato un esempio del `pom.xml` file per un progetto che utilizza Amazon S3 la versione 1.x e la versione DynamoDB 2.27.21.

**Example Esempio di POM**  
Questo esempio mostra una voce di `pom.xml` file per un progetto che utilizza entrambe le versioni 1.x e 2.x dell'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>
```