

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Migrasi dari versi 1.x ke 2.x dari AWS SDK untuk Java
<a name="migration"></a>

 AWS SDK untuk Java 2.x adalah penulisan ulang utama dari basis kode 1.x yang dibangun di atas Java 8\$1. Ini mencakup banyak pembaruan, seperti peningkatan konsistensi, kemudahan penggunaan, dan kekekalan yang ditegakkan dengan kuat. Bagian ini menjelaskan fitur utama yang baru di versi 2.x, dan memberikan panduan tentang cara memigrasikan kode Anda ke versi 2.x dari 1.x.

**Topics**
+ [Apa yang baru di versi 2](#migration-whats-new)
+ [Temukan aplikasi menggunakan klien 1.x](migration-find-apps-using-v1.md)
+ [Cara bermigrasi](migration-howto.md)
+ [Apa yang berbeda antara 1.x dan 2.x](migration-whats-different.md)
+ [Gunakan SDK for Java 1.x dan 2.x side-by-side](migration-side-by-side.md)

## Apa yang baru di versi 2
<a name="migration-whats-new"></a>
+ Anda dapat mengkonfigurasi klien HTTP Anda sendiri. Lihat [konfigurasi transport HTTP](http-configuration.md).
+ Klien async menampilkan I/O dukungan non-pemblokiran dan mengembalikan objek. `CompletableFuture` Lihat [Pemrograman asinkron](asynchronous.md).
+ Operasi yang mengembalikan beberapa halaman memiliki respons autopaginasi. Dengan cara ini, Anda dapat memfokuskan kode Anda pada apa yang harus dilakukan dengan respons, tanpa perlu memeriksa dan mendapatkan halaman berikutnya. Lihat [Pagination](pagination.md). 
+ Kinerja waktu mulai SDK untuk AWS Lambda fungsi ditingkatkan. Lihat [Peningkatan kinerja waktu mulai SDK](lambda-optimize-starttime.md). 
+ Versi 2.x mendukung metode singkatan baru untuk membuat permintaan.  
**Example**  

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

Untuk detail lebih lanjut tentang fitur baru dan untuk melihat contoh kode tertentu, lihat bagian lain dari panduan ini.
+  [Mulai Cepat](get-started.md) 
+  [Menyiapkan](setup.md) 
+  [Contoh kode untuk AWS SDK untuk Java 2.x](java_code_examples.md)
+  [Gunakan SDK](using.md) 
+  [Keamanan untuk AWS SDK untuk Java](security.md) 

# Temukan aplikasi menggunakan klien AWS SDK untuk Java 1.x
<a name="migration-find-apps-using-v1"></a>

Sebelum bermigrasi ke AWS SDK for Java 2.x, Anda perlu mengidentifikasi aplikasi mana di lingkungan Anda yang menggunakan SDK for Java 1.x klien. Anda dapat menggunakan CloudTrail log untuk melacak penggunaan SDK, mencari log aplikasi untuk peringatan penghentian, memeriksa kode sumber dan membangun konfigurasi, atau memeriksa artefak Java yang dapat diterapkan. Gunakan metode apa pun yang tersedia di lingkungan Anda.

## Gunakan CloudTrail Lake untuk menemukan aplikasi dengan klien 1.x
<a name="migration-find-v1-apps-with-cloudtrail"></a>

AWS CloudTrail Lake memungkinkan Anda menanyakan peristiwa yang direkam oleh CloudTrail. Ikuti langkah-langkah berikut untuk membuat data lake yang mengidentifikasi versi SDK yang digunakan oleh aplikasi Anda:

1. Buat danau CloudTrail data. Lihat [Panduan pengguna](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/query-event-data-store.html) untuk membuat penyimpanan data acara.

1. Setelah Anda membuat penyimpanan data, periksa isi catatan. Badan rekaman berisi bidang yang menentukan tindakan, waktu, dan lokasi yang diminta. Untuk detailnya, lihat [Panduan pengguna untuk konten CloudTrail rekaman](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-event-reference-record-contents.html).

1. Jalankan kueri terhadap data Anda. Ikuti [Panduan Pengguna untuk menanyakan dan menyimpan hasil kueri](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/query-run-query.html).

Bidang *UserAgent* di setiap record berisi versi SDK yang membuat permintaan. Gunakan bidang ini untuk mengidentifikasi aplikasi yang menggunakan SDK for Java 1.x.

Contoh kueri berikut menemukan semua permintaan dari aplikasi pengguna dan alat pihak ketiga yang dibuat dengan SDK for Java 1.x mulai 17 Juni 2025, untuk ID: 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
```

Contoh konten acara dalam hasil kueri terlihat seperti ini:

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

Anda dapat menggunakan informasi ini untuk membantu menentukan kapan dan di mana permintaan dibuat.

Dalam contoh, permintaan `ListTables` DynamoDB dibuat `2025-07-01 02:23:52 (UTC)` di dari `12.345.6.78` Alamat IP dengan kredensi pengguna IAM bernama Alice. Nilai bidang *UserAgent* menunjukkan bahwa permintaan dibuat menggunakan AWS SDK untuk Java versi `1.12.746` dari sistem Linux dengan JDK 11.

Untuk deskripsi bidang dalam catatan AWS CloudTrail peristiwa, lihat [konten CloudTrail rekaman untuk peristiwa manajemen, data, dan aktivitas jaringan](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-event-reference-record-contents.html).

Jika tidak CloudTrail diaktifkan di akun Anda, hubungi administrator AWS akun organisasi Anda untuk mengaktifkannya, atau gunakan salah satu metode alternatif yang dijelaskan di bagian berikut.

CloudTrail Danau mengenakan biaya untuk data yang dicerna dan data yang dipindai per kueri. Untuk meminimalkan biaya, filter kueri ke rentang waktu dan wilayah tertentu. Untuk harga saat ini, lihat [AWS CloudTrail Harga](https://aws.amazon.com/cloudtrail/pricing/).

## Cari log tingkat peringatan aplikasi untuk penghentian SDK
<a name="migration-find-v1-apps-log-warning"></a>

Dimulai dengan versi 1.12.767 (dirilis pada 30 Juli 2024), AWS SDK untuk Java 1.x memancarkan peringatan penghentian saat startup aplikasi. Anda dapat mencari log aplikasi Anda untuk peringatan ini untuk mengidentifikasi aplikasi dan host mana yang menggunakan SDK for Java 1.x.

Kata-kata yang tepat dari peringatan tergantung pada versi SDK:
+ Versi 1.12.767 melalui 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...`
+ Versi 1.12.797 dan lebih tinggi:

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

Trailing `...` menunjukkan bahwa pesan peringatan berlanjut dengan teks tambahan. Anda dapat mencari awalan umum `The AWS SDK for Java 1.x` untuk menemukan salah satu versi peringatan.

Contoh berikut menunjukkan pencarian peringatan ini menggunakan`grep`:

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

Jika peringatan ditemukan, `grep` perintah mencetak baris log yang cocok. Jika tidak ada peringatan yang ditemukan, aplikasi Anda tidak menggunakan SDK for Java 1.x, atau menggunakan versi lebih awal dari 1.12.767. Dalam hal ini, gunakan salah satu metode lain yang dijelaskan dalam dokumen ini.

## Cari kode sumber dan dependensi
<a name="migration-find-v1-apps-source-code"></a>

Anda dapat mencari basis kode dan membangun file konfigurasi untuk referensi ke AWS SDK untuk Java 1.x. Pengidentifikasi kunci adalah ID `com.amazonaws` grup, yang digunakan oleh semua artefak SDK for Java 1.x.

Contoh berikut menunjukkan penggunaan `grep` untuk mencari `com.amazonaws` referensi di seluruh file proyek Java umum.

**Contoh: Cari file sumber Java untuk SDK for Java 1.x impor (dijalankan dari direktori root proyek)**

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

Contoh output:

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

**catatan**  
`com.amazonaws`Paket ini juga digunakan oleh pustaka yang bukan bagian dari SDK for Java 1.x, seperti. `aws-lambda-java-core` Untuk mengonfirmasi impor berasal dari SDK for Java 1.x, periksa apakah ID artefak yang sesuai di konfigurasi manajemen`build.gradle`,, atau dependensi `pom.xml` Anda dimulai dengan. `aws-java-sdk-`

**Contoh: Cari `pom.xml` file Maven untuk SDK for Java 1.x dependensi (dijalankan dari direktori root proyek)**

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

Contoh output:

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

**Contoh: Cari file build Gradle untuk dependensi SDK for Java 1.x (dijalankan dari direktori root proyek)**

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

Contoh output:

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

`grep`Perintah sebelumnya mengidentifikasi referensi SDK for Java 1.x yang dideklarasikan langsung di file sumber dan build Anda. Namun, aplikasi Anda mungkin juga bergantung pada SDK for Java 1.x secara transitif — melalui pustaka pihak ketiga yang bergantung pada SDK. Gunakan pohon dependensi alat build Anda untuk menemukan dependensi SDK for Java 1.x langsung dan transitif. Pilih contoh yang cocok dengan sistem build Anda.

**Contoh: Gunakan Maven untuk menemukan semua transitif SDK for Java 1.x dependensi (dijalankan dari direktori root proyek)**

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

Contoh output:

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

`-Dincludes=com.amazonaws`Bendera memfilter pohon untuk hanya menampilkan artefak SDK for Java 1.x. Dalam contoh ini, `aws-java-sdk-s3` adalah ketergantungan langsung, tetapi `aws-java-sdk-dynamodb` merupakan ketergantungan transitif yang dibawa oleh. `some.thirdparty:library`

**Contoh: Gunakan Gradle untuk menemukan semua dependensi SDK for Java 1.x (dijalankan dari direktori root proyek)**

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

Contoh output:

```
+--- 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 tidak memiliki filter ketergantungan bawaan yang setara dengan Maven`-Dincludes`, jadi pemipaan `grep` adalah pendekatan yang paling sederhana.

## Periksa artefak Java yang dapat digunakan
<a name="migration-find-v1-apps-inspect-artifacts"></a>

Anda dapat memeriksa artefak Java yang dapat di-deploy (JARs, WARs, atau EARs) untuk mengonfirmasi apakah AWS SDK untuk Java 1.x dikemas dengan aplikasi Anda. File arsip Java adalah file format ZIP. Untuk menentukan apakah SDK for Java 1.x hadir, cari `com/amazonaws/sdk/versionInfo.properties` file di dalam arsip. File ini disertakan dalam `aws-java-sdk-core` modul dan berisi nomor versi SDK.

### Periksa cepat dengan `jar` perintah
<a name="migration-find-v1-apps-jar-command"></a>

Untuk uber-jar di mana semua kelas dependensi digabungkan di tingkat atas, cantumkan konten arsip dan cari file versi:

Dalam contoh berikut, ganti `myapp.jar` dengan path ke file JAR aplikasi Anda.

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

Jika SDK hadir, outputnya adalah:

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

Jika `jar` perintah tidak tersedia di lingkungan Anda (misalnya, JRE-only atau gambar kontainer minimal), Anda dapat menggunakan `unzip -l` sebagai gantinya:

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

Untuk mencetak versi:

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

Contoh output:

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

**catatan**  
Perintah sebelumnya hanya mencari entri tingkat atas di uber-jar. Mereka tidak akan menemukan kelas SDK dalam bentuk tipis JARs (di mana dependensi bersifat eksternal) atau di dalam bersarang JARs (seperti yang ada di WARs,, EARs atau paket Lambda di bawah atau). `lib/` `WEB-INF/lib/` Untuk thin JARs, periksa konfigurasi build (`pom.xml`,`build.gradle`) atau pohon dependensi sebagai gantinya. Untuk bersarang JARs, cari yang dibundel JARs menggunakan alat yang dapat membaca arsip ZIP secara rekursif tanpa mengekstraksi ke disk.

# Cara memigrasikan kode Anda dari AWS SDK untuk Java 1.x ke 2.x
<a name="migration-howto"></a>

Anda dapat memigrasikan SDK for Java 1.x aplikasi yang ada dalam beberapa cara.

1. Pendekatan otomatis dengan menggunakan [alat migrasi](migration-tool.md).

1. [Pendekatan manual](migration-steps.md) dengan mengganti impor 1.x secara bertahap dengan impor 2.x.

Kami menyarankan Anda memulai dengan menggunakan alat migrasi. Ini mengotomatiskan sebagian besar pekerjaan rutin, penggantian dari kode 1.x ke 2.x. 

Karena alat [tidak memigrasikan semua fitur](migration-tool.md#migration-tool-limitations), Anda harus mencari kode v1 yang tersisa setelah menjalankan alat. Bila Anda menemukan kode yang alat tidak bermigrasi, ikuti [step-by-step petunjuk](migration-steps.md) (pendekatan manual) dan gunakan [artikel panduan migrasi](migration-whats-different.md) untuk menyelesaikan migrasi.

**Topics**
+ [Alat migrasi](migration-tool.md)
+ [Step-by-step instruksi](migration-steps.md)

# AWS SDK untuk Java alat migrasi
<a name="migration-tool"></a>

 AWS SDK untuk Java Ini menyediakan alat migrasi yang membantu mengotomatiskan migrasi kode SDK for Java 1.x (V1) ke 2.x (V2). Alat ini menggunakan [OpenRewrite](https://docs.openrewrite.org/)—sumber terbuka, alat refactoring kode sumber—untuk melakukan migrasi. OpenRewrite menggunakan aturan modifikasi kode (disebut “resep”) untuk secara otomatis memperbarui kode sumber Anda dari sintaks dan pola V1 ke V2.

Alat ini mendukung aturan modifikasi kode untuk klien layanan SDK dan pustaka tingkat tinggi [S3 Transfer Manager](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/transfer/TransferManager.html). Aturan modifikasi kode untuk tingkat tinggi lainnya APIs seperti DynamoDB [Enhanced Client API V1 [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)ke V2 tidak didukung](dynamodb-enhanced-client.md). 

Untuk detail lebih lanjut tentang batasan, lihat [akhir halaman ini](#migration-tool-limitations). Untuk contoh detail pola kode umum yang tidak didukung dengan langkah migrasi manual, lihat Pola [kode tidak didukung](migration-tool-unsupported-patterns.md).

## Gunakan alat migrasi
<a name="migration-tool-use"></a>

### Migrasi proyek Maven
<a name="migration-tool-use-maven"></a>

[Ikuti petunjuk di bawah ini untuk memigrasikan SDK for Java 1.x proyek berbasis Maven dengan menggunakan alat plugin Maven. OpenRewrite](https://docs.openrewrite.org/reference/rewrite-maven-plugin)

1. Arahkan ke direktori root proyek Maven Anda

   Buka jendela terminal (baris perintah) dan arahkan ke direktori root aplikasi berbasis MAVENN Anda.

1. Jalankan `rewrite-maven-plugin` perintah plugin

   Anda dapat memilih dari dua mode (tujuan Maven): `dryRun` dan. `run`

   **`dryRun`****modus**

   Dalam `dryRun` mode, plugin menghasilkan log diff di output konsol dan file patch bernama `rewrite.patch` di `target/rewrite` folder. Mode ini memungkinkan Anda untuk melihat pratinjau perubahan yang akan dilakukan, karena tidak ada perubahan yang dilakukan pada file kode sumber. 

   Contoh berikut menunjukkan cara memanggil plugin dalam `dryRun` mode.

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

   \$1Ganti *<rewrite-plugin-version>* dengan `rewriteMavenPluginVersion` nilai yang Anda lihat di [file pengujian](https://github.com/aws/aws-sdk-java-v2/blob/3a01289246f1f4ac814a354051d00030e53ef968/test/v2-migration-tests/src/test/java/software/amazon/awssdk/v2migrationtests/MavenTestBase.java#L54) ini.

   \$1\$1 Ganti *<sdkversion>* dengan versi 2.x SDK. Kunjungi [Maven Central](https://central.sonatype.com/artifact/software.amazon.awssdk/v2-migration) untuk memeriksa versi terbaru. 
**penting**  
Pastikan untuk menggunakan versi yang `rewrite-maven-plugin` ditampilkan dalam [file pengujian](https://github.com/aws/aws-sdk-java-v2/blob/3a01289246f1f4ac814a354051d00030e53ef968/test/v2-migration-tests/src/test/java/software/amazon/awssdk/v2migrationtests/MavenTestBase.java#L54) karena versi lain mungkin tidak berfungsi.

   Output konsol Anda dari `dryRun` mode harus menyerupai output berikut.

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

   **`run`****modus**

   Ketika Anda menjalankan plugin dalam `run` mode, itu memodifikasi kode sumber pada disk untuk menerapkan perubahan. Pastikan Anda memiliki cadangan kode sumber sebelum menjalankan perintah.

   Contoh berikut menunjukkan cara memanggil plugin dalam `run` mode.

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

   \$1 Ganti *<rewrite-plugin-version>* dengan `rewriteMavenPluginVersionvalue` yang Anda lihat di [file pengujian](https://github.com/aws/aws-sdk-java-v2/blob/3a01289246f1f4ac814a354051d00030e53ef968/test/v2-migration-tests/src/test/java/software/amazon/awssdk/v2migrationtests/MavenTestBase.java#L54) ini.

   \$1\$1 Ganti *<sdkversion>* dengan versi 2.x SDK. Kunjungi [Maven Central](https://central.sonatype.com/artifact/software.amazon.awssdk/v2-migration) untuk memeriksa versi terbaru. 

   Setelah Anda menjalankan perintah, kompilasi aplikasi Anda dan jalankan tes untuk memverifikasi perubahan. 

### Migrasi proyek Gradle
<a name="migration-tool-use-gradle"></a>

[Ikuti petunjuk di bawah ini untuk memigrasikan SDK for Java 1.x proyek berbasis Gradle dengan menggunakan alat plugin Gradle. OpenRewrite](https://docs.openrewrite.org/reference/gradle-plugin-configuration)

1. Arahkan ke direktori root proyek Gradle

   Buka jendela terminal (baris perintah) dan arahkan ke direktori root aplikasi berbasis Gradle Anda.

1. Buat skrip init Gradle

   Buat `init.gradle` file dengan konten berikut di direktori.

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

   \$1 Ganti *<rewrite-plugin-version>* dengan versi yang Anda lihat di [file pengujian](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) ini.

1. Jalankan `rewrite` perintah

   Seperti halnya plugin Maven, Anda dapat menjalankan plugin Gradle dalam `dryRun` mode atau. `run`

   **`dryRun`modus**

   Contoh berikut menunjukkan cara memanggil plugin dalam `dryRun` mode.

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

   **`run`modus**

   Contoh berikut menunjukkan cara memanggil plugin dalam `run` mode.

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

## Keterbatasan saat ini
<a name="migration-tool-limitations"></a>

Meskipun migrasi mengunggah sebagian besar kode V1 melalui aturan modifikasi kode yang diperbarui ke setara V2, beberapa kelas dan metode tidak tercakup. Untuk kelas dan metode ini, ikuti [step-by-step petunjuk](migration-steps.md) untuk memigrasikan kode Anda secara manual.

Untuk beberapa aturan modifikasi kode yang tidak didukung, alat migrasi dapat menambahkan komentar yang dimulai dengan:

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

Mengikuti komentar, alat ini mengeluarkan rintisan generik dari versi V2 dari metode atau kelas. Misalnya, dalam output berikut, alat migrasi mencoba memigrasi metode klien 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());
```

Tautan dalam daftar di bawah ini, membawa Anda ke informasi migrasi untuk membantu Anda memigrasikan kode secara manual.
+ [Perbedaan klien S3 antara versi 1 dan versi 2 AWS SDK untuk Java](migration-s3-client.md)
+ [Manajer Transfer S3](migration-s3-transfer-manager.md) () TransferManager
+ [Pemetaan objek DynamoDB (Dynamo](migration-ddb-mapper.md)) DBMapper
+ [EC2 utilitas metadata](migration-imds.md) () EC2 MetadataUtils
+ [Pelayan ()](migration-waiters.md) AmazonDynamo DBWaiters
+ [Pembangun Kebijakan IAM](migration-iam-policy-builder.md) (Kebijakan)
+ [CloudFront presigning](migration-cloudfront-presigning.md) (CloudFrontUrlSigner, CloudFrontCookieSigner)
+ [Pemberitahuan Acara S3](migration-s3-event-notification.md) (EventNotificationS3)
+ Penerbitan metrik SDK (dokumentasi [1.x, dokumentasi](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/generating-sdk-metrics.html) [2.x](metrics.md))
+ [Pola kode yang tidak didukung](migration-tool-unsupported-patterns.md) —Contoh rinci pola kode umum yang memerlukan migrasi manual

# Pola kode alat migrasi yang tidak didukung
<a name="migration-tool-unsupported-patterns"></a>

Alat migrasi secara otomatis mengonversi sebagian besar kode v1 ke v2. Namun, beberapa pola kode memerlukan migrasi manual. Topik ini memberikan contoh rinci tentang pola yang tidak didukung yang paling umum dan menunjukkan kepada Anda cara mengonversinya secara manual.

Daftar pola berikut ini tidak lengkap. Jika kode Anda tidak dikompilasi setelah menjalankan alat migrasi, ikuti [petunjuk step-by-step migrasi](migration-steps.md) untuk memigrasikan kode v1 yang tersisa secara manual.

## Minta konstruktor objek dengan parameter
<a name="request-pojo-constructors"></a>

Untuk permintaan POJOs (tidak termasuk Amazon S3), alat migrasi hanya mengubah metode penyetel. Alat ini tidak mendukung konstruktor dengan parameter.

**Pola yang didukung: Minta objek menggunakan setter (tidak ada parameter konstruktor)**

Sebelum (kode v1 asli):

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

Setelah (hasil alat migrasi):

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

**Pola tidak didukung: Minta konstruktor objek dengan parameter**

Alat migrasi tidak dapat mengonversi konstruktor dengan parameter:

Sebelum migrasi manual, tetapi setelah alat migrasi:

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

Alat migrasi mengubah impor ke v2, tetapi kode konstruktor tetap tidak berubah dan memerlukan pembaruan manual untuk menggunakan pola pembangun.

Setelah migrasi manual:

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

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

## Metode klien layanan dengan parameter individual
<a name="service-client-method-overloads"></a>

Alat migrasi tidak dapat mengonversi metode klien layanan yang mengambil parameter individual alih-alih objek permintaan (tidak termasuk Amazon S3).

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

Setelah (hasil alat migrasi — tidak dikompilasi):

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

Anda harus memperbarui argumen metode secara manual untuk menggunakan objek permintaan:

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

## Minta metode batas waktu
<a name="request-pojo-timeout-configuration"></a>

Alat migrasi tidak mengonversi metode yang menetapkan batas waktu pada objek permintaan.

Sebelum (kode v1):

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

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

Setelah (hasil alat migrasi — tidak dikompilasi):

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

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

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

Anda harus melakukan migrasi secara manual untuk menggunakan `overrideConfiguration` metode v2:

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

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

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

## Konstruktor klien layanan dengan parameter
<a name="service-client-constructors-with-args"></a>

Alat migrasi mengonversi konstruktor klien layanan kosong tetapi tidak dapat mengonversi konstruktor yang menerima parameter seperti kredensil atau konfigurasi.

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

Setelah (hasil alat migrasi — tidak dikompilasi):

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

Anda harus memperbarui konstruktor klien layanan secara manual untuk menggunakan pola pembangun:

```
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-stepInstruksi migrasi dengan contoh
<a name="migration-steps"></a>

Bagian ini menyediakan step-by-step panduan untuk memigrasikan aplikasi Anda yang saat ini menggunakan SDK for Java v1.x ke SDK for Java 2.x. Bagian pertama menyajikan ikhtisar langkah-langkah yang diikuti dengan contoh rinci migrasi.

Langkah-langkah yang dibahas di sini menjelaskan migrasi kasus penggunaan normal, di mana aplikasi memanggil Layanan AWS menggunakan klien layanan berbasis model. Jika Anda perlu memigrasikan kode yang menggunakan level yang lebih tinggi APIs seperti [S3 Transfer Manager](migration-s3-transfer-manager.md) atau [CloudFrontpresigning](migration-cloudfront-presigning.md), lihat bagian di bawah [Apa yang berbeda antara AWS SDK untuk Java 1.x dan 2.x](migration-whats-different.md) daftar isi.



Pendekatan yang dijelaskan di sini adalah saran. Anda dapat menggunakan teknik lain dan memanfaatkan fitur pengeditan kode IDE Anda untuk mencapai hasil yang sama. 

## Ikhtisar langkah-langkah
<a name="migration-steps-overview"></a>

### 1. Mulailah dengan menambahkan SDK for Java 2.x BOM
<a name="migration-steps-overview-step1"></a>

Dengan menambahkan elemen Maven BOM (Bill of Materials) untuk SDK for Java 2.x ke file POM Anda, Anda memastikan bahwa semua ketergantungan v2 yang Anda butuhkan berasal dari versi yang sama. POM Anda dapat berisi dependensi v1 dan v2. Ini memungkinkan Anda untuk memigrasikan kode secara bertahap daripada mengubah semuanya sekaligus.

#### SDK for 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>
```

Anda dapat menemukan [versi terbaru](https://central.sonatype.com/artifact/software.amazon.awssdk/bom) di Maven Central Repository.

### 2. Cari file untuk pernyataan impor kelas v1
<a name="migration-steps-overview-step2"></a>

Dengan memindai file dalam aplikasi Anda untuk SERVICE\$1 yang IDs digunakan dalam impor v1, Anda akan menemukan SERVICE\$1 unik yang digunakan. IDs SERVICE\$1ID adalah nama pendek dan unik untuk sebuah. Layanan AWS Misalnya `cognitoidentity` adalah SERVICE\$1ID untuk Identitas Amazon Cognito.

### 3. Tentukan dependensi Maven v2 dari pernyataan impor v1
<a name="migration-steps-overview-step3"></a>

Setelah Anda menemukan semua v1 SERVICE\$1 yang unikIDs, Anda dapat menentukan artefak Maven yang sesuai untuk ketergantungan v2 dengan mengacu pada. [Nama Package untuk pemetaan ArtifactID Maven](#migration-serviceid-artifactid-mapping)

### 4. Tambahkan elemen ketergantungan v2 ke file POM
<a name="migration-steps-overview-step4"></a>

Perbarui file Maven POM dengan elemen ketergantungan ditentukan pada langkah 3.

### 5. Dalam file Java, secara bertahap ubah kelas v1 ke kelas v2
<a name="migration-steps-overview-step5"></a>

Saat Anda mengganti kelas v1 dengan kelas v2, buat perubahan yang diperlukan untuk mendukung API v2 seperti menggunakan pembangun alih-alih konstruktor dan menggunakan pengambil dan penyetel yang lancar.

### 6. Hapus dependensi v1 Maven dari impor POM dan v1 dari file
<a name="migration-steps-overview-step6"></a>

Setelah memigrasikan kode untuk menggunakan kelas v2, hapus semua impor v1 yang tersisa dari file dan semua dependensi dari file build Anda.

### 7. Memfaktorkan ulang kode untuk menggunakan penyempurnaan API v2
<a name="migration-steps-overview-step7"></a>

Setelah kode berhasil mengkompilasi dan lulus tes, Anda dapat memanfaatkan penyempurnaan v2 seperti menggunakan klien HTTP atau paginator yang berbeda untuk menyederhanakan kode. Ini adalah langkah opsional.

## Contoh migrasi
<a name="migration-steps-example"></a>

Dalam contoh ini, kami memigrasikan aplikasi yang menggunakan SDK for Java v1 dan mengakses beberapa. Layanan AWS Kami bekerja melalui metode v1 berikut secara rinci di langkah 5. Ini adalah salah satu metode dalam kelas yang berisi delapan metode dan ada 32 kelas dalam aplikasi.

### metode v1 untuk bermigrasi
<a name="v1-snippet-collapsed"></a>

Hanya impor SDK v1 yang tercantum di bawah ini dari 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. Tambahkan v2 Maven BOM
<a name="migration-steps-example-step1"></a>

Tambahkan Maven BOM untuk SDK for Java 2.x ke POM di samping dependensi lain di bagian tersebut. `dependencyManagement` Jika file POM Anda memiliki BOM untuk v1 SDK, biarkan untuk saat ini. Ini akan dihapus pada langkah selanjutnya.

#### Manajemen Ketergantungan POM di awal
<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. Cari file untuk pernyataan impor kelas v1
<a name="migration-steps-example-step2"></a>

Cari kode aplikasi untuk kejadian unik. `import com.amazonaws.services` Ini membantu kami menentukan dependensi v1 yang digunakan oleh proyek. Jika aplikasi Anda memiliki file POM Maven dengan dependensi v1 terdaftar, Anda dapat menggunakan informasi ini sebagai gantinya. 

Untuk contoh ini kita menggunakan perintah [`ripgrep`(rg)](https://github.com/BurntSushi/ripgrep) untuk mencari basis kode.

Dari root basis kode Anda, jalankan `ripgrep` perintah berikut. Setelah `ripgrep` menemukan pernyataan impor, mereka disalurkan ke`cut`,`sort`, dan `uniq` perintah untuk mengisolasi SERVICE\$1. IDs 

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

Untuk aplikasi ini, SERVICE\$1 IDs berikut dicatat ke konsol.

```
autoscaling
cloudformation
ec2
identitymanagement
```

Ini menunjukkan bahwa setidaknya ada satu kemunculan dari masing-masing nama paket berikut yang digunakan dalam `import` pernyataan. Untuk tujuan kita, nama kelas individu tidak masalah. Kita hanya perlu menemukan SERVICE\$1 IDs yang digunakan.

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

### 3. Tentukan dependensi Maven v2 dari pernyataan impor v1
<a name="migration-steps-example-step3"></a>

SERVICE\$1 IDs untuk v1 yang kami isolasi dari Langkah 2—misalnya `cloudformation` dan—dapat dipetakan ke `autoscaling` v2 SERVICE\$1ID yang sama untuk sebagian besar. Karena artifactID Maven v2 cocok dengan SERVICE\$1ID dalam banyak kasus, Anda memiliki informasi yang Anda perlukan untuk menambahkan blok ketergantungan ke file POM Anda.

Tabel berikut menunjukkan bagaimana kita dapat menentukan dependensi v2.


| v1 SERVICE\$1ID memetakan ke...nama paket | v2 SERVICE\$1ID memetakan ke...nama paket | v2 Ketergantungan Maven | 
| --- | --- | --- | 
|  **ec2** `com.amazonaws.services.ec2.*`  |  **ec2** `software.amazon.awssdk.services.ec2.*`  |  <pre><dependency><br />  <groupId>software.amazon.awssdk</groupId><br />  <artifactId>ec2</artifactId><br /></dependency></pre>  | 
|  **penskalaan otomatis** `com.amazonaws.services.autoscaling.*`  |  **penskalaan otomatis** `software.amazon.awssdk.services.autoscaling.*`  |  <pre><dependency><br />  <groupId>software.amazon.awssdk</groupId><br />  <artifactId>autoscaling</artifactId><br /></dependency></pre>  | 
| pembentukan awan`com.amazonaws.services.cloudformation.*` | pembentukan awan`software.amazon.awssdk.cloudformation.*` |  <pre><dependency><br />  <groupId>software.amazon.awssdk</groupId><br />  <artifactId>cloudformation</artifactId><br /></dependency></pre>  | 
| manajemen identitas\$1`com.amazonaws.services.identitymanagement.*` | iam\$1`software.amazon.awssdk.iam.*` |  <pre><dependency><br />  <groupId>software.amazon.awssdk</groupId><br />  <artifactId>iam</artifactId><br /></dependency></pre>  | 

\$1 The `identitymanagement` to `iam` mapping adalah pengecualian di mana SERVICE\$1ID berbeda antar versi. Lihat pengecualian [Nama Package untuk pemetaan ArtifactID Maven](#migration-serviceid-artifactid-mapping) untuk jika Maven atau Gradle tidak dapat menyelesaikan ketergantungan v2.

### 4. Tambahkan elemen ketergantungan v2 ke file POM
<a name="migration-steps-example-step4"></a>

Pada langkah 3, kami menentukan empat blok ketergantungan yang perlu ditambahkan ke file POM. Kami tidak perlu menambahkan versi karena kami telah menentukan BOM di langkah 1. Setelah impor ditambahkan, file POM kami memiliki elemen ketergantungan berikut.

```
    ...
  <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. Dalam file Java, secara bertahap ubah kelas v1 ke kelas v2
<a name="migration-steps-example-step5"></a>

Dalam metode yang kita migrasi, kita lihat
+ Klien layanan EC2 dari`com.amazonaws.services.ec2.AmazonEC2Client`.
+ Beberapa kelas model EC2 digunakan. Misalnya `DescribeInstancesRequest` dan`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;
}
...
```

Tujuan kami adalah mengganti semua impor v1 dengan impor v2. Kami melanjutkan satu kelas pada satu waktu.

#### a. Ganti pernyataan impor atau nama kelas
<a name="migration-example-step5-substep1"></a>

Kita melihat bahwa parameter pertama untuk `describeRunningInstances` metode ini adalah `AmazonEC2Client` instance v1. Lakukan salah satu tindakan berikut:
+ Ganti impor untuk `com.amazonaws.services.ec2.AmazonEC2Client` dengan `software.amazon.awssdk.services.ec2.Ec2Client` dan ubah `AmazonEC2Client` ke`Ec2Client`.
+ Ubah tipe parameter menjadi `Ec2Client` dan biarkan IDE meminta kami untuk impor yang benar. IDE kami akan meminta kami untuk mengimpor kelas v2 karena nama klien berbeda— `AmazonEC2Client` dan`Ec2Client`. Pendekatan ini tidak berfungsi jika nama kelas sama di kedua versi.

#### b. Ganti kelas model v1 dengan setara v2
<a name="migration-example-step5-substep2"></a>

Setelah perubahan ke v2`Ec2Client`, jika kita menggunakan IDE, kita melihat kesalahan kompilasi dalam pernyataan berikut.

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

Kesalahan kompilasi dihasilkan dari penggunaan instance v1 `DescribeInstancesRequest` sebagai parameter ke `Ec2Client` `describeInstances` metode v2. Untuk memperbaikinya, buat pernyataan penggantian atau impor berikut.


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

#### c. Ubah konstruktor v1 menjadi pembangun v2.
<a name="migration-example-step5-substep3"></a>

Kami masih melihat kesalahan kompilasi karena [tidak ada konstruktor di kelas v2](migration-whats-different.md#immutable-classes). Untuk memperbaikinya, buat perubahan berikut.


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

#### d. Ganti objek `*Result` respons v1 dengan ekuivalen v2 `*Response`
<a name="migration-example-step5-substep4"></a>

Perbedaan yang konsisten antara v1 dan v2 adalah bahwa semua [objek respons di v2 diakhiri dengan `*Response` alih-alih. `*Result`](migration-whats-different.md#model-classname-changes) Ganti impor v1 ke `DescribeInstancesResult` impor v2,`DescribeInstancesResponse`.

#### d. Buat perubahan API
<a name="migration-example-step5-substep5"></a>

Pernyataan berikut membutuhkan beberapa perubahan.

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

Dalam v2, [metode setter](migration-whats-different.md#setter-getter-methods) tidak menggunakan `set` atau dengan`prefix`. Metode getter yang diawali dengan `get` juga hilang di SDK for Java 2.x

Kelas model, seperti `request` instance, tidak dapat diubah di v2, jadi kita perlu membuat yang baru `DescribeInstancesRequest` dengan pembangun.

Dalam v2, pernyataan menjadi sebagai berikut.

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

#### d. Ulangi sampai metode dikompilasi dengan kelas v2
<a name="migration-example-step5-substep6"></a>

Lanjutkan dengan sisa kode. Ganti impor v1 dengan impor v2 dan perbaiki kesalahan kompilasi. Lihat [Referensi API v2 dan Referensi](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/ec2/package-summary.html) [apa yang berbeda](migration-whats-different.md) sesuai kebutuhan.

Setelah kami memigrasikan metode tunggal ini, kami memiliki kode v2 berikut.

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

Karena kami memigrasikan satu metode dalam file Java dengan delapan metode, kami memiliki campuran impor v1 dan v2 saat kami mengerjakan file. Kami menambahkan enam pernyataan impor terakhir saat kami melakukan langkah-langkahnya. 

Setelah kami memigrasikan semua kode, tidak akan ada lagi pernyataan impor v1.

### 6. Hapus dependensi v1 Maven dari impor POM dan v1 dari file
<a name="migration-steps-example-step6"></a>

Setelah kami memigrasikan semua kode v1 dalam file, kami memiliki pernyataan impor SDK v2 berikut.

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

Setelah kita memigrasikan *semua* file dalam aplikasi kita, kita tidak lagi membutuhkan dependensi v1 dalam file POM kita. Hapus v1 BOM dari `dependencyManagement` bagian, jika menggunakan, dan semua blok ketergantungan v1.

### 7. Memfaktorkan ulang kode untuk menggunakan penyempurnaan API v2
<a name="migration-steps-example-step7"></a>

Untuk cuplikan yang telah kami migrasi, kami dapat menggunakan paginator v2 secara opsional dan membiarkan SDK mengelola permintaan berbasis token untuk lebih banyak data.

Kita dapat mengganti seluruh `do` klausa dengan yang berikut ini.

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

## Nama Package untuk pemetaan ArtifactID Maven
<a name="migration-serviceid-artifactid-mapping"></a>

Saat memigrasikan project Maven atau Gradle dari v1 SDK for Java ke v2, Anda perlu mencari tahu dependensi mana yang akan ditambahkan ke file build Anda. Pendekatan yang dijelaskan dalam [step-by-stepInstruksi migrasi dengan contoh](#migration-steps) (langkah 3) menggunakan nama paket dalam pernyataan import sebagai titik awal untuk menentukan dependensi (sebagai ArtifactIds) untuk ditambahkan ke file build Anda. 

Anda dapat menggunakan informasi dalam topik ini untuk memetakan nama paket v1 ke v2 Artifactids.

### Konvensi penamaan umum yang digunakan dalam nama paket dan Maven Artifactids
<a name="migration-naming-convention"></a>

Tabel berikut menunjukkan konvensi penamaan umum yang SDKs digunakan untuk SERVICE\$1ID tertentu. SERVICE\$1ID adalah pengidentifikasi unik untuk file. Layanan AWS Misalnya, SERVICE\$1ID untuk layanan Amazon S3 adalah `s3` dan merupakan SERVICE\$1ID untuk Identitas Amazon `cognitoidentity` Cognito.


| nama paket v1 (pernyataan impor) | v1 Artifactid | v2 Artifactid | v2 nama paket (pernyataan impor) | 
| --- | --- | --- | --- | 
| com.amazonaws.services.service\$1id | aws-java-sdk-SERVICE\$1ID | SERVICE\$1ID | Software.amazon.awssdk.services.service\$1id | 
|   | 
| Contoh untuk Identitas Amazon Cognito (SERVICE\$1ID:) cognitoidentity | 
| com.amazonaws.services. kognitoidentitas | aws-java-sdk- kognitoidentitas | kognitoidentitas | software.amazon.awssdk.services. kognitoidentitas | 

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

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

Dalam beberapa kasus, SERVICE\$1ID berbeda antara nama paket dan di ArtifactID untuk layanan yang sama. Misalnya, baris CloudWatch Metrik dari tabel berikut menunjukkan bahwa itu `metrics` adalah SERVICE\$1ID dalam nama paket tetapi `cloudwatchmetrics` merupakan SERVICE\$1ID ArtifactID.

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

Tidak ada perbedaan dalam SERVICE\$1ID yang digunakan dalam nama paket dan Artifactids.

#### Antara v1 dan v2
<a name="migration-serviceid-diffs-btwv1v2"></a>

Untuk sebagian besar layanan, SERVICE\$1ID di v2 sama dengan SERVICE\$1ID v1 di kedua nama paket dan Artifactids. Contoh dari ini adalah `cognitoedentity` SERVICE\$1ID seperti yang ditunjukkan pada tabel sebelumnya. Namun, beberapa SERVICE\$1 IDs berbeda antara SDKs seperti yang ditunjukkan pada tabel berikut.

**SERVICE\$1ID huruf tebal** di salah satu kolom v1 menunjukkan bahwa itu berbeda dari SERVICE\$1ID yang digunakan di v2.


| Nama layanan | nama paket v1 | v1 Artifactid | v2 Artifactid | v2 nama paket | 
| --- | --- | --- | --- | --- | 
|  |  Semua nama paket dimulai dengan `com.amazonaws.services` seperti yang ditunjukkan pada baris pertama.  |  Semua ArtifactID disertakan dalam tag seperti yang ditunjukkan pada baris pertama.  |  Semua ArtifactID disertakan dalam tag seperti yang ditunjukkan pada baris pertama.  |  Semua nama paket dimulai dengan `software.amazon.awssdk` seperti yang ditunjukkan pada baris pertama.  | 
|  | 
| API Gateway | com.amazonaws.services.apigateway | <artifactId>aws-java-sdk- api-gateway</artifactId> | <artifactId>apigateway</artifactId> | software.amazon.awssdk.services.apigateway | 
| Registri Aplikasi | appregistry | appregistry | servicecatalogappregistry | servicecatalogappregistry | 
| Penemuan Aplikasi | aplikasipenemuan | penemuan | aplikasipenemuan | aplikasipenemuan | 
| Runtime AI yang Augmented | augmentedairuntime | augmentedairuntime | sagemakera2iruntime | sagemakera2iruntime | 
| Certificate Manager | Certificatemanager | acm | acm | acm | 
| CloudControl API | cloudcontrolapi | cloudcontrolapi | cloudcontrol | cloudcontrol | 
| CloudSearch | cloudsearchv2 | cloudsearch | cloudsearch | cloudsearch | 
| CloudSearch Domain | cloudsearchdomain | cloudsearch | cloudsearchdomain | cloudsearchdomain | 
| CloudWatch Acara | cloudwatchevents | acara | cloudwatchevents | cloudwatchevents | 
| CloudWatch Terbukti | cloudwatchevident | cloudwatchevident | ternyata | ternyata | 
| CloudWatch Log | log | log | cloudwatchlogs | cloudwatchlogs | 
| CloudWatch Metrik | metrik | cloudwatchmetrics | cloudwatch | cloudwatch | 
| CloudWatch Rum | cloudwatchrum | cloudwatchrum | rum | rum | 
| Penyedia Identitas Cognito | cognitoidp | cognitoidp | penyedia cognitoidentityprovider | penyedia cognitoidentityprovider | 
| Kampanye Connect | connectcampaign | connectcampaign | connectcampaign | connectcampaign | 
| Connect Wisdom | connectwisdom | connectwisdom | kebijaksanaan | kebijaksanaan | 
| Database Migration Service | databasemigrationservice | dms | migrasi basis data | migrasi basis data | 
| DataZone | datazone | datazoneeksternal | datazone | datazone | 
| DynamoDB | dynamodbv2 | dynamodb | dynamodb | dynamodb | 
| Sistem File Elastis | sistem file elastis | efs | efs | efs | 
| Kurangi Peta Elastis | elasticmapreduce | emr | emr | emr | 
| Glue DataBrew | gluedatabrew | gluedatabrew | databrew | databrew | 
| IAM Roles Anywhere | iamrolesdi mana saja | iamrolesdi mana saja | peranandi mana saja | peranandi mana saja | 
| Manajemen Identitas | manajemen identitas | iam | iam | iam | 
| Data IoT | iotdata | iot | iotdataplane | iotdataplane | 
| Analisis Kinesis | kinesisanalitik | kinesis | kinesisanalitik | kinesisanalitik | 
| Kinesis Firehose | kinesisfirehose | kinesis | firehose | firehose | 
| Saluran Sinyal Video Kinesis | kinesisvideosignalingchannels | kinesisvideosignalingchannels | kinesisvideosignaling | kinesisvideosignaling | 
| Lex | lexruntime | lex | lexruntime | lexruntime | 
| Lookout Untuk Visi | lookoutforvision | lookoutforvision | lookoutvision | lookoutvision | 
| Modernisasi Mainframe | mainframemodernisasi | mainframemodernisasi | m2 | m2 | 
| Pengukuran Marketplace | pemeteran pasar | layanan marketplacemeteringservice | pemeteran pasar | pemeteran pasar | 
| Grafana yang Dikelola | managedgrafana | managedgrafana | grafana | grafana | 
| Mechanical Turk | mturk | mechanicalturkrequester | mturk | mturk | 
| Rekomendasi Strategi Migrasi Hub | Migrationhubstrategyrecommendations | Migrationhubstrategyrecommendations | Migrationhubstrategy | Migrationhubstrategy | 
| Nimble Studio | lincah studio | lincah studio | gesit | gesit | 
| 5G pribadi | private5g | private5g | privatenetworks | privatenetworks | 
| Prometheus | prometheus | prometheus | amp | amp | 
| Tempat Sampah Daur Ulang | Recyclebin | Recyclebin | rbin | rbin | 
| API Data Pergeseran Merah | redshiftdataapi | redshiftdataapi | data pergeseran merah | data pergeseran merah | 
| Route 53 | route53domain | route53 | route53domain | route53domain | 
| Manajer Tepi Pembuat Sage | sagemakeredgemanager | sagemakeredgemanager | sagemakeredge | sagemakeredge | 
| Token Keamanan | securitytoken | sts | sts | sts | 
| Migrasi Server | migrasi server | migrasi server | sms | sms | 
| Email Sederhana | email sederhana | ses | ses | ses | 
| Email Sederhana V2 | simpleemailv2 | sesv2 | sesv2 | sesv2 | 
| Manajemen Sistem Sederhana | manajemen sistem sederhana | ssm | ssm | ssm | 
| Alur Kerja Sederhana | alur kerja sederhana | alur kerja sederhana | swf | swf | 
| Step Functions | stepfungsi | stepfungsi | sfn | sfn | 

# Apa yang berbeda antara AWS SDK untuk Java 1.x dan 2.x
<a name="migration-whats-different"></a>

Bagian ini menjelaskan perubahan utama yang harus diperhatikan saat mengonversi aplikasi dari menggunakan AWS SDK untuk Java versi 1.x ke versi 2.x.

## Perubahan nama Package
<a name="mig-diff-package-name-change"></a>

Perubahan nyata dari SDK for Java 1.x ke SDK for Java 2.x adalah perubahan nama paket. Nama Package dimulai dengan `software.amazon.awssdk` SDK 2.x, sedangkan SDK 1.x menggunakan. `com.amazonaws`

Nama yang sama ini membedakan artefak Maven dari SDK 1.x ke SDK 2.x. Artefak Maven untuk SDK 2.x menggunakan `software.amazon.awssdk` GroupId, sedangkan SDK 1.x menggunakan GroupId. `com.amazonaws`

Ada beberapa kali ketika kode Anda memerlukan `com.amazonaws` ketergantungan untuk proyek yang sebaliknya hanya menggunakan artefak SDK 2.x. Salah satu contohnya adalah ketika Anda bekerja dengan sisi server AWS Lambda. Ini ditunjukkan di bagian [Siapkan proyek Apache Maven](setup-project-maven.md#modules-dependencies) sebelumnya dalam panduan ini.

**catatan**  
Beberapa nama paket di SDK 1.x berisi. `v2` Penggunaan `v2` dalam kasus ini biasanya berarti bahwa kode dalam paket ditargetkan untuk bekerja dengan versi 2 dari layanan.   
Karena nama paket lengkap dimulai dengan`com.amazonaws`, ini adalah komponen SDK 1.x. Contoh nama paket ini di SDK 1.x adalah:   
`com.amazonaws.services.dynamodbv2`
`com.amazonaws.retry.v2`
`com.amazonaws.services.apigatewayv2`
`com.amazonaws.services.simpleemailv2`

## Menambahkan versi 2.x ke proyek Anda
<a name="adding-v2"></a>

Maven adalah cara yang disarankan untuk mengelola dependensi saat menggunakan 2.x. AWS SDK untuk Java Untuk menambahkan komponen versi 2.x ke project Anda, perbarui `pom.xml` file Anda dengan ketergantungan pada 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>
```

Anda juga dapat [menggunakan versi 1.x dan 2.x side-by-side](migration-side-by-side.md) saat memigrasikan proyek ke versi 2.x.

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

Klien dan permintaan operasi dan objek respons sekarang tidak dapat diubah dan tidak dapat diubah setelah pembuatan. Untuk menggunakan kembali variabel permintaan atau respons, Anda harus membangun objek baru untuk menetapkan objek tersebut.

**Example memperbarui objek permintaan di 1.x**  

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

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

**Example memperbarui objek permintaan di 2.x**  

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

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

## Metode setter dan getter
<a name="setter-getter-methods"></a>

Di AWS SDK untuk Java 2.x, nama metode penyetel tidak menyertakan awalan `set` atau`with`. Misalnya, `*.withEndpoint()` sekarang`*.endpoint()`.

Nama metode getter tidak menggunakan `get` awalan.

**Example menggunakan metode setter di 1.x**  

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

**Example menggunakan metode setter di 2.x**  

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

**Example menggunakan metode pengambil di 1.x**  

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

**Example menggunakan metode pengambil di 2.x**  

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

## Nama kelas model
<a name="model-classname-changes"></a>

Nama kelas model yang mewakili respons layanan diakhiri dengan `Response` in v2 alih-alih `Result` yang digunakan v1.

**Example nama kelas yang mewakili respons di v1**  

```
CreateApiKeyResult
AllocateAddressResult
```

**Example nama kelas yang mewakili respons di v2**  

```
CreateApiKeyResponse
AllocateAddressResponse
```

## Status migrasi perpustakaan dan utilitas
<a name="migration-libraries-utilities"></a>

### SDK for Java library dan utilitas
<a name="migration-java-sdk-libs-utils"></a>

Tabel berikut mencantumkan status migrasi pustaka dan utilitas untuk SDK for Java. 


| Versi 1.12.x nama | Nama versi 2.x | Sejak versi di 2.x | 
| --- | --- | --- | 
| Dinamo DBMapper | [DynamoDbEnhancedClient](dynamodb-enhanced-client.md) | 2.12.0 | 
| Pelayan | [Pelayan](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 | [S3 TransferManager](transfer-manager.md) | 2.19.0 | 
| Klien Metadata EC2 |  [Klien Metadata EC2](examples-ec2-IMDS.md)  | 2.19.29 | 
| Pengurai URI S3 |  [Pengurai URI S3](https://aws.amazon.com/blogs/devops/s3-uri-parsing-is-now-available-in-aws-sdk-for-java-2-x/)  | 2.20.41 | 
| Pembangun Kebijakan IAM | [Pembangun Kebijakan IAM](feature-iam-policy-builder.md) | 2.20.126 | 
| Notifikasi Peristiwa S3 | [Pemberitahuan Acara S3](examples-s3-event-notifications.md#s3-event-notification-read) | 2.25.11  | 
| Buffering sisi klien Amazon SQS | [API Batching Permintaan Otomatis untuk Amazon SQS](sqs-auto-batch.md) | 2.28.0 | 
| Pendengar Kemajuan | Pendengar Kemajuan | [belum dirilis](https://github.com/aws/aws-sdk-java-v2/issues/25) | 

### Perpustakaan terkait
<a name="migration-other-sdks"></a>

Tabel berikut mencantumkan pustaka yang dirilis secara terpisah tetapi bekerja dengan SDK for Java 2.x.


| Nama yang digunakan dengan versi 2.x dari SDK for Java | Sejak versi | 
| --- | --- | 
|  [Klien Enkripsi 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 Enkripsi Database untuk DynamoDB](https://docs.aws.amazon.com/database-encryption-sdk/latest/devguide/ddb-java.html) | 3.0.0 2 | 

#### 1 Klien Enkripsi Amazon S3
<a name="migration-s3-encryption-sdk"></a>

Klien enkripsi untuk Amazon S3 tersedia dengan menggunakan ketergantungan Maven berikut.

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

#### 2 SDK Enkripsi AWS Database untuk DynamoDB
<a name="migration-ddb-encryption-sdk"></a>

SDK Enkripsi AWS Database untuk DynamoDB tersedia untuk V2 dengan menggunakan dependensi Maven berikut.

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

Informasi tentang pustaka enkripsi untuk DynamoDB yang bekerja dengan v1 dari Java SDK tersedia di [AWS Panduan Pengembang SDK Enkripsi Database (bernama Amazon *DynamoDB*](https://docs.aws.amazon.com/database-encryption-sdk/latest/devguide/java.html) Encryption Client for Java) dan di. [GitHub](https://github.com/aws/aws-dynamodb-encryption-java)

[Untuk informasi selengkapnya tentang pustaka enkripsi DynamoDB yang kompatibel dengan V2 dari Java SDK, lihat Panduan Pengembang SDK [Enkripsi Database dan AWS sumbernya](https://docs.aws.amazon.com/database-encryption-sdk/latest/devguide/ddb-java.html). GitHub](https://github.com/aws/aws-database-encryption-sdk-dynamodb)

Informasi migrasi tentang pustaka enkripsi tersedia di [Panduan Pengembang SDK Enkripsi AWS Database](https://docs.aws.amazon.com/database-encryption-sdk/latest/devguide/ddb-java-migrate.html).

### Detail migrasi untuk perpustakaan dan utilitas
<a name="migrate-libs-utils-details"></a>
+ [Manajer Transfer](migration-s3-transfer-manager.md)
+ [Utilitas metadata EC2](migration-imds.md)
+ [CloudFrontprepenandatanganan](migration-cloudfront-presigning.md)
+ [Penguraian URI S3](migration-s3-uri-parser.md)
+ [DynamoDB mapping/document APIs](migration-ddb-mapper.md) 
+ [Pembangun Kebijakan IAM](migration-iam-policy-builder.md)
+ [Pemberitahuan Acara S3](migration-s3-event-notification.md)
+ Penerbitan metrik SDK (dokumentasi [1.x, dokumentasi](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/generating-sdk-metrics.html) [2.x](metrics.md))

# Perubahan klien
<a name="migration-clients"></a>

## Pembangun klien
<a name="client-builder"></a>

Anda harus membuat semua klien menggunakan metode pembangun klien. Konstruktor tidak lagi tersedia.

**Example membuat klien di versi 1.x**  

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

**Example membuat klien di versi 2.x**  

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

## Nama kelas klien
<a name="class-names"></a>

Semua nama kelas klien sekarang sepenuhnya berselubung unta dan tidak lagi diawali oleh. `Amazon` Perubahan ini selaras dengan nama yang digunakan dalam. AWS CLI

**Example nama kelas di 1.x**  

```
AmazonDynamoDB
AWSACMPCAAsyncClient
```

**Example nama kelas di 2.x**  

```
DynamoDbClient
AcmAsyncClient
```


**Perubahan nama kelas klien**  

| 1.x Klien | 2.x Klien | 
| --- | --- | 
| 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 | Tidak Didukung  | 
| 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 | 

# Default pembuatan klien
<a name="client-creation-defaults"></a>

Dalam versi 2.x, perubahan berikut telah dilakukan pada logika pembuatan klien default.
+ Rantai penyedia kredensi default untuk S3 tidak lagi menyertakan kredenal anonim. Anda harus secara manual menentukan akses anonim ke S3 dengan menggunakan file. `AnonymousCredentialsProvider`
+ Variabel lingkungan berikut yang terkait dengan pembuatan klien default berbeda.    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/sdk-for-java/latest/developer-guide/client-creation-defaults.html)
+ Properti sistem berikut yang terkait dengan pembuatan klien default berbeda.     
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/sdk-for-java/latest/developer-guide/client-creation-defaults.html)
+ Versi 2.x tidak mendukung properti sistem berikut.
+     
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/sdk-for-java/latest/developer-guide/client-creation-defaults.html)
+ Memuat konfigurasi Wilayah dari `endpoints.json` file kustom tidak lagi didukung.

# Konfigurasi klien
<a name="client-configuration"></a>

Di 1.x, konfigurasi klien SDK dimodifikasi dengan menyetel `ClientConfiguration` instance pada klien atau pembuat klien. Dalam versi 2.x, konfigurasi klien dibagi menjadi kelas konfigurasi terpisah. Dengan kelas konfigurasi terpisah, Anda dapat mengonfigurasi klien HTTP yang berbeda untuk klien async versus sinkron tetapi masih menggunakan kelas yang sama. `ClientOverrideConfiguration`

**Example konfigurasi klien dalam versi 1.x**  

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

**Example konfigurasi klien sinkron di versi 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 konfigurasi klien asinkron di versi 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();
```

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

### Perubahan penting
<a name="client-configuration-http-notables"></a>
+ Di versi 2.x, Anda dapat mengubah klien HTTP mana yang akan digunakan saat runtime dengan menentukan implementasi yang digunakan. `clientBuilder.httpClientBuilder`
+ Ketika Anda meneruskan klien HTTP dengan menggunakan `clientBuilder.httpClient` ke pembuat klien layanan, klien HTTP tidak ditutup secara default jika klien layanan ditutup. Ini memungkinkan Anda untuk berbagi klien HTTP antara klien layanan.
+ Klien HTTP asinkron sekarang menggunakan IO non-pemblokiran.
+ Beberapa operasi sekarang menggunakan HTTP/2 untuk meningkatkan kinerja.

### Pengaturan berubah
<a name="client-configuration-http-setting-diffs"></a>


| Pengaturan | 1.x | 2.x Sinkronisasi, Apache | 2.x Asinkron, Netty | 
| --- | --- | --- | --- | 
|  |  <pre>ClientConfiguration clientConfig = <br />    new ClientConfiguration()</pre>  |  <pre>ApacheHttpClient.Builder httpClientBuilder = <br />    ApacheHttpClient.builder()</pre>  |  <pre>NettyNioAsyncHttpClient.Builder httpClientBuilder = <br />    NettyNioAsyncHttpClient.builder()</pre>  | 
| Koneksi maks |  <pre>clientConfig.setMaxConnections(...)<br />clientConfig.withMaxConnections(...)</pre>  |  <pre>httpClientBuilder.maxConnections(...)</pre>  |  <pre>httpClientBuilder.maxConcurrency(...)</pre>  | 
| Batas waktu koneksi |  <pre>clientConfig.setConnectionTimeout(...)<br />clientConfig.withConnectionTimeout(...)</pre>  |  <pre>httpClientBuilder.connectionTimeout(...)<br />httpClientBuilder.connectionAcquisitionTimeout(...)</pre>  |  <pre>httpClientBuilder.connectionTimeout(...)</pre>  | 
| Batas waktu soket |  <pre>clientConfig.setSocketTimeout(...)<br />clientConfig.withSocketTimeout(...)</pre>  |  <pre>httpClientBuilder.socketTimeout(...)</pre>  |  <pre>httpClientBuilder.writeTimeout(...)<br />httpClientBuilder.readTimeout(...)</pre>  | 
| Koneksi TTL |  <pre>clientConfig.setConnectionTTL(...)<br />clientConfig.withConnectionTTL(...)</pre>  |  <pre>httpClientBuilder.connectionTimeToLive(...)</pre>  |  <pre>httpClientBuilder.connectionTimeToLive(...)</pre>  | 
| Koneksi maks idle |  <pre>clientConfig.setConnectionMaxIdleMillis(...)<br />clientConfig.withConnectionMaxIdleMillis(...)</pre>  |  <pre>httpClientBuilder.connectionMaxIdleTime(...)</pre>  |  <pre>httpClientBuilder.connectionMaxIdleTime(...)</pre>  | 
| Validasi setelah tidak aktif |  <pre>clientConfig.setValidateAfterInactivityMillis(...)<br />clientConfig.withValidateAfterInactivityMillis(...)</pre>  | Tidak didukung ([Fitur Permintaan](https://github.com/aws/aws-sdk-java-v2/issues/new)) | Tidak didukung ([Fitur Permintaan](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
| Alamat lokal |  <pre>clientConfig.setLocalAddress(...)<br />clientConfig.withLocalAddress(...)</pre>  |  <pre>httpClientBuilder.localAddress(...)</pre>  | [Tidak didukung](https://github.com/aws/aws-sdk-java-v2/issues/857) | 
| Harapan-lanjutkan diaktifkan |  <pre>clientConfig.setUseExpectContinue(...)<br />clientConfig.withUseExpectContinue(...)</pre>  |  <pre>httpClientBuilder.expectContinueEnabled(...)</pre>  | Tidak didukung ([Fitur Permintaan](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
| Penuai koneksi |  <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>  | 

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


| Pengaturan | 1.x | 2.x Sinkronisasi, Apache | 2.x Asinkron, Netty | 
| --- | --- | --- | --- | 
|  |  <pre>ClientConfiguration clientConfig =<br />    new ClientConfiguration()</pre>  |  <pre>ProxyConfiguration.Builder proxyConfig =<br />    ProxyConfiguration.builder()</pre>  |  <pre>ProxyConfiguration.Builder proxyConfig =<br />    ProxyConfiguration.builder()</pre>  | 
| Tuan rumah proxy |  <pre>clientConfig.setProxyHost(...)<br />clientConfig.withProxyHost(...)</pre>  |  <pre>proxyConfig.endpoint(...)</pre>  |  <pre>proxyConfig.host(...)</pre>  | 
| Port proxy |  <pre>clientConfig.setProxyPort(...)<br />clientConfig.withProxyPort(...)</pre>  |  <pre>proxyConfig.endpoint(...)</pre> [Port proxy](http-configuration-apache.md#http-configuration-apache-proxy-conf-ex) disematkan di `endpoint`  |  <pre>proxyConfig.port(...)</pre>  | 
| Nama pengguna proxy |  <pre>clientConfig.setProxyUsername(...)<br />clientConfig.withProxyUsername(...)</pre>  |  <pre>proxyConfig.username(...)</pre>  |  <pre>proxyConfig.username(...)</pre>  | 
| Kata sandi proxy |  <pre>clientConfig.setProxyPassword(...)<br />clientConfig.withProxyPassword(...)</pre>  |  <pre>proxyConfig.password(...)</pre>  |  <pre>proxyConfig.password(...)</pre>  | 
| Domain proxy |  <pre>clientConfig.setProxyDomain(...)<br />clientConfig.withProxyDomain(...)</pre>  |  <pre>proxyConfig.ntlmDomain(...)</pre>  | Tidak Didukung ([Fitur Permintaan](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
| Stasiun kerja proxy |  <pre>clientConfig.setProxyWorkspace(...)<br />clientConfig.withProxyWorkstation(...)</pre>  |  <pre>proxyConfig.ntlmWorkstation(...)</pre>  | Tidak Didukung ([Fitur Permintaan](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
| Metode otentikasi proxy |  <pre>clientConfig.setProxyAuthenticationMethods(...)<br />clientConfig.withProxyAuthenticationMethods(...)</pre>  |  [Tidak Didukung](https://github.com/aws/aws-sdk-java-v2/issues/858)  | Tidak Didukung ([Fitur Permintaan](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
| Autentikasi proxy dasar preemptive |  <pre>clientConfig.setPreemptiveBasicProxyAuth(...)<br />clientConfig.withPreemptiveBasicProxyAuth(...)</pre>  |  <pre>proxyConfig.preemptiveBasicAuthenticationEnabled(...)</pre>  | Tidak Didukung ([Fitur Permintaan](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>  | 
| Nonaktifkan proxy soket |  <pre>clientConfig.setDisableSocketProxy(...)<br />clientConfig.withDisableSocketProxy(...)</pre>  | Tidak Didukung ([Fitur Permintaan](https://github.com/aws/aws-sdk-java-v2/issues/new)) | Tidak Didukung ([Fitur Permintaan](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>  | 

## Pengesampingan klien
<a name="client-override-config-diffs"></a>


| Pengaturan | 1.x | 2.x | 
| --- | --- | --- | 
|  |  <pre>ClientConfiguration clientConfig =<br />    new ClientConfiguration()</pre>  |  <pre>ClientOverrideConfiguration.Builder overrideConfig =<br />    ClientOverrideConfiguration.builder()</pre>  | 
| Awalan agen pengguna |  <pre>clientConfig.setUserAgentPrefix(...)<br />clientConfig.withUserAgentPrefix(...)</pre>  |  <pre>overrideConfig.advancedOption(<br />    SdkAdvancedClientOption.USER_AGENT_PREFIX, ...)</pre>  | 
| Akhiran agen pengguna |  <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>  | 
| Header tambahan |  <pre>clientConfig.addHeader(...)<br />clientConfig.withHeader(...)</pre>  |  <pre>overrideConfig.putHeader(...)</pre>  | 
| Permintaan waktu habis |  <pre>clientConfig.setRequestTimeout(...)<br />clientConfig.withRequestTimeout(...)</pre>  |  <pre>overrideConfig.apiCallAttemptTimeout(...)</pre>  | 
| Batas waktu eksekusi klien |  <pre>clientConfig.setClientExecutionTimeout(...)<br />clientConfig.withClientExecutionTimeout(...)</pre>  |  <pre>overrideConfig.apiCallTimeout(...)</pre>  | 
| Gunakan Gzip |  <pre>clientConfig.setUseGzip(...)<br />clientConfig.withGzip(...)</pre>  |  Tidak Didukung ([Fitur Permintaan](https://github.com/aws/aws-sdk-java-v2/issues/new))  | 
| Petunjuk ukuran penyangga soket |  <pre>clientConfig.setSocketBufferSizeHints(...)<br />clientConfig.withSocketBufferSizeHints(...)</pre>  | Tidak Didukung ([Fitur Permintaan](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
| Metadata respons cache |  <pre>clientConfig.setCacheResponseMetadata(...)<br />clientConfig.withCacheResponseMetadata(...)</pre>  | Tidak Didukung ([Fitur Permintaan](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
| Ukuran cache metadata respons |  <pre>clientConfig.setResponseMetadataCacheSize(...)<br />clientConfig.withResponseMetadataCacheSize(...)</pre>  | Tidak Didukung ([Fitur Permintaan](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
| DNS resolver |  <pre>clientConfig.setDnsResolver(...)<br />clientConfig.withDnsResolver(...)</pre>  | Tidak Didukung ([Fitur Permintaan](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
| TCP keepalive |  <pre>clientConfig.setUseTcpKeepAlive(...)<br />clientConfig.withTcpKeepAlive(...)</pre>  |  Opsi ini sekarang dalam konfigurasi HTTP Client <pre>- ApacheHttpClient.builder().tcpKeepAlive(true)<br />- NettyNioAsyncHttpClient.builder().tcpKeepAlive(true)</pre>  | 
| Amankan acak |  <pre>clientConfig.setSecureRandom(...)<br />clientConfig.withSecureRandom(...)</pre>  | Tidak Didukung ([Fitur Permintaan](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>  | 

## Klien mengganti percobaan ulang
<a name="client-override-retry-config-diffs"></a>


| Pengaturan | 1.x | 2.x | 
| --- | --- | --- | 
|  |  <pre>ClientConfiguration clientConfig =<br />    new ClientConfiguration()</pre>  |  <pre>ClientOverrideConfiguration.Builder overrideConfigBuilder = <br />    ClientOverrideConfiguration.builder();</pre>  | 
| Kesalahan maks coba lagi |  <pre>clientConfig.setMaxErrorRetry(...)<br />clientConfig.withMaxErrorRetry(...)</pre>  |  <pre>// Configure the default retry strategy.<br />overrideConfigBuilder.retryStrategy(b -> b.maxAttempts(...));</pre>  | 
| Gunakan percobaan ulang yang dibatasi |  <pre>clientConfig.setUseThrottleRetries(...)<br />clientConfig.withUseThrottleRetries(...)</pre>  | [Tidak didukung](https://github.com/aws/aws-sdk-java-v2/issues/645) | 
| Maks percobaan ulang berturut-turut sebelum throttling |  <pre>clientConfig.setMaxConsecutiveRetriesBeforeThrottling(...)<br />clientConfig.withMaxConsecutiveRetriesBeforeThrottling(...)</pre>  | [Tidak didukung](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>  | 

## Klien asinkron
<a name="client-async-config-diffs"></a>


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

## Perubahan klien lainnya
<a name="client-config-other-diffs"></a>

`ClientConfiguration`Opsi berikut dari 1.x telah berubah di 2.x SDK dan tidak memiliki ekuivalen langsung.


| Pengaturan | 1.x | 2.x setara | 
| --- | --- | --- | 
| Protokol |  <pre>clientConfig.setProtocol(Protocol.HTTP)<br />clientConfig.withProtocol(Protocol.HTTP)</pre>  |  Pengaturan protokol adalah HTTPS secara default. Untuk mengubah pengaturan, tentukan protokol yang mengatur titik akhir HTTP pada pembuat klien: <pre>clientBuilder.endpointOverride(<br />    URI.create("http://..."))</pre>  | 

# Perubahan penyedia kredensial
<a name="migration-client-credentials"></a>

Bagian ini menyediakan pemetaan perubahan nama kelas penyedia kredensil dan metode antara versi 1.x dan 2.x dari. AWS SDK untuk Java

## Perbedaan penting
<a name="client-credentials"></a>
+ Penyedia kredensial default memuat properti sistem sebelum variabel lingkungan di versi 2.x. Untuk informasi selengkapnya, lihat [Menggunakan kredensil](credentials.md).
+ Metode konstruktor diganti dengan `builder` metode `create` or.  
**Example**  

  ```
  DefaultCredentialsProvider.create();
  ```
+ Penyegaran asinkron tidak lagi disetel secara default. Anda harus menentukannya dengan `builder` penyedia kredensi.  
**Example**  

  ```
  ContainerCredentialsProvider provider = ContainerCredentialsProvider.builder()
          		.asyncCredentialUpdateEnabled(true)
          		.build();
  ```
+ Anda dapat menentukan jalur ke file profil khusus menggunakan file`ProfileCredentialsProvider.builder()`.  
**Example**  

  ```
  ProfileCredentialsProvider profile = ProfileCredentialsProvider.builder()
          		.profileFile(ProfileFile.builder().content(Paths.get("myProfileFile.file")).build())
          		.build();
  ```
+ Format file profil telah berubah agar lebih cocok dengan file AWS CLI. Untuk detailnya, lihat [Mengonfigurasi AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html) dalam *Panduan AWS Command Line Interface Pengguna*.

## Perubahan penyedia kredensil dipetakan antara versi 1.x dan 2.x
<a name="credentials-changes-mapping"></a>

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


| Ubah kategori | 1.x | 2.x | 
| --- | --- | --- | 
| Nama paket/kelas | com.amazonaws.auth.AWSCredentialsProvider | software.amazon.awssdk.auth.credentials.AwsCredentialsProvider | 
| Nama metode | getCredentials | resolveCredentials | 
| Metode yang tidak didukung | refresh | Tidak didukung | 

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


| Ubah kategori | 1.x | 2.x | 
| --- | --- | --- | 
| Nama paket/kelas | com.amazonaws.auth.DefaultAWSCredentialsProviderChain | software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider | 
| Pembuatan | new DefaultAWSCredentialsProviderChain | DefaultCredentialsProvider.create | 
| Metode yang tidak didukung | getInstance | Tidak didukung | 
| Urutan prioritas pengaturan eksternal |  Variabel lingkungan sebelum properti sistem  |  Properti sistem sebelum variabel lingkungan  | 

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


| Ubah kategori | 1.x | 2.x | 
| --- | --- | --- | 
| Nama paket/kelas | com.amazonaws.auth.AWSStaticCredentialsProvider | software.amazon.awssdk.auth.credentials.StaticCredentialsProvider | 
| Pembuatan | new AWSStaticCredentialsProvider | StaticCredentialsProvider.create | 

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


| Ubah kategori | 1.x | 2.x | 
| --- | --- | --- | 
| Nama paket/kelas | com.amazonaws.auth.EnvironmentVariableCredentialsProvider | software.amazon.awssdk.auth.credentials.EnvironmentVariableCredentialsProvider | 
| Pembuatan | new EnvironmentVariableCredentialsProvider | EnvironmentVariableCredentialsProvider.create | 
| Nama variabel lingkungan | AWS\$1ACCESS\$1KEY | AWS\$1ACCESS\$1KEY\$1ID | 
|  | AWS\$1SECRET\$1KEY | AWS\$1SECRET\$1ACCESS\$1KEY | 

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


| Ubah kategori | 1.x | 2.x | 
| --- | --- | --- | 
| Nama paket/kelas | com.amazonaws.auth.SystemPropertiesCredentialsProvider | software.amazon.awssdk.auth.credentials.SystemPropertyCredentialsProvider | 
| Pembuatan | new SystemPropertiesCredentialsProvider | SystemPropertiesCredentialsProvider.create | 
| Nama properti sistem | aws.secretKey | aws.secretAccessKey | 

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


| Ubah kategori | 1.x | 2.x | 
| --- | --- | --- | 
| Nama paket/kelas | com.amazonaws.auth.profile.ProfileCredentialsProvider | software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider | 
| Pembuatan | new ProfileCredentialsProvider | ProfileCredentialsProvider.create | 
| Lokasi profil kustom |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/sdk-for-java/latest/developer-guide/migration-client-credentials.html)  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/sdk-for-java/latest/developer-guide/migration-client-credentials.html)  | 

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


| Ubah kategori | 1.x | 2.x | 
| --- | --- | --- | 
| Nama paket/kelas | com.amazonaws.auth.ContainerCredentialsProvider | software.amazon.awssdk.auth.credentials.ContainerCredentialsProvider | 
| Pembuatan | new ContainerCredentialsProvider | ContainerCredentialsProvider.create | 
| Tentukan penyegaran asinkron | Tidak didukung | Perilaku default | 

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


| Ubah kategori | 1.x | 2.x | 
| --- | --- | --- | 
| Nama paket/kelas | com.amazonaws.auth.InstanceProfileCredentialsProvider | software.amazon.awssdk.auth.credentials.InstanceProfileCredentialsProvider | 
| Pembuatan | new InstanceProfileCredentialsProvider | InstanceProfileCredentialsProvider.create | 
| Tentukan penyegaran asinkron | new InstanceProfileCredentialsProvider(true) |  `InstanceProfileCredentialProvider.builder().asyncCredentialUpdateEnabled(true).build()`  | 
| Nama properti sistem | com.amazonaws.sdk.disableEc2Metadata | aws.disableEc2Metadata | 
|  | com.amazonaws.sdk.ec2MetadataServiceEndpointOverride | aws.ec2MetadataServiceEndpoint | 

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


| Ubah kategori | 1.x | 2.x | 
| --- | --- | --- | 
| Nama paket/kelas | com.amazonaws.auth.STSAssumeRoleSessionCredentialsProvider | software.amazon.awssdk.services.sts.auth.StsAssumeRoleCredentialsProvider | 
| Pembuatan |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/sdk-for-java/latest/developer-guide/migration-client-credentials.html)  | StsAssumeRoleCredentialsProvider.builder | 
| Penyegaran asinkron | Perilaku default | Perilaku default | 
| Konfigurasi | new STSAssumeRoleSessionCredentialsProvider.Builder | Konfigurasikan AssumeRoleRequest permintaan StsClient dan | 

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


| Ubah kategori | 1.x | 2.x | 
| --- | --- | --- | 
| Nama paket/kelas | com.amazonaws.auth.STSSessionCredentialsProvider | software.amazon.awssdk.services.sts.auth.StsGetSessionTokenCredentialsProvider | 
| Pembuatan |  `new STSSessionCredentialsProvider`  | StsGetSessionTokenCredentialsProvider.builder | 
| Penyegaran asinkron | Perilaku default | StsGetSessionTokenCredentialsProvider.builder | 
| Konfigurasi | Parameter konstruktor | Konfigurasikan GetSessionTokenRequest permintaan StsClient dan di pembangun | 

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


| Ubah kategori | 1.x | 2.x | 
| --- | --- | --- | 
| Nama paket/kelas | com.amazonaws.auth.WebIdentityFederationSessionCredentialsProvider | software.amazon.awssdk.services.sts.auth.StsAssumeRoleWithWebIdentityCredentialsProvider | 
| Pembuatan |  `new WebIdentityFederationSessionCredentialsProvider`  | StsAssumeRoleWithWebIdentityCredentialsProvider.builder | 
| Penyegaran asinkron | Perilaku default | StsAssumeRoleWithWebIdentityCredentialsProvider.builder | 
| Konfigurasi | Parameter konstruktor | Konfigurasikan AssumeRoleWithWebIdentityRequest permintaan StsClient dan di pembangun | 

### Kelas diganti
<a name="credentials-provider-changes-Replacements"></a>


| Kelas 1.x | 2.x kelas pengganti | 
| --- | --- | 
| com.amazonaws.auth.EC2ContainerCredentialsProviderWrapper | software.amazon.awssdk.auth.credentials.ContainerCredentialsProvider dan software.amazon.awssdk.auth.credentials.InstanceProfileCredentialsProvider | 
| com.amazonaws.services.s3.S3CredentialsProviderChain | software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider dan software.amazon.awssdk.auth.credentials.AnonymousCredentialsProvider | 

### Kelas dihapus
<a name="credentials-provider-changes-Removed"></a>


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

# Perubahan wilayah
<a name="migration-client-region"></a>

Bagian ini menjelaskan perubahan yang diterapkan di AWS SDK untuk Java 2.x untuk menggunakan `Region` dan `Regions` kelas.

## Konfigurasi wilayah
<a name="region-configuration"></a>
+ Beberapa AWS layanan tidak memiliki titik akhir khusus Wilayah. Saat menggunakan layanan tersebut, Anda harus mengatur Wilayah sebagai `Region.AWS_GLOBAL` atau`Region.AWS_CN_GLOBAL`.  
**Example**  

  ```
  Region region = Region.AWS_GLOBAL;
  ```
+  `com.amazonaws.regions.Regions`dan `com.amazonaws.regions.Region` kelas sekarang digabungkan menjadi satu kelas,`software.amazon.awssdk.regions.Region`.

## Metode dan pemetaan nama kelas
<a name="region-method-mapping"></a>

Tabel berikut memetakan kelas terkait Wilayah antara versi 1.x dan 2.x dari. AWS SDK untuk Java Anda dapat membuat instance dari kelas-kelas ini menggunakan `of()` metode.

**Example**  

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


**1.x Perubahan metode kelas Wilayah**  

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


**1.x Perubahan metode kelas Wilayah**  

| 1.x | 2.x | 
| --- | --- | 
|  `Region.getName`  |  `Region.id`  | 
|  `Region.hasHttpsEndpoint`  |  Tidak Didukung  | 
|  `Region.hasHttpEndpoint`  |  Tidak Didukung  | 
|  `Region.getAvailableEndpoints`  |  Tidak Didukung  | 
|  `Region.createClient`  |  Tidak Didukung  | 


**RegionMetadata perubahan metode kelas**  

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


**ServiceMetadata perubahan metode kelas**  

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

# Operasi, permintaan, dan tanggapan berubah
<a name="migration-operation-requests-responses"></a>

Dalam versi 2 SDK for Java, permintaan diteruskan ke operasi klien. Misalnya `DynamoDbClient's` `PutItemRequest` diteruskan ke `DynamoDbClient.putItem` operasi. Operasi ini mengembalikan respons dari Layanan AWS, seperti a`PutItemResponse`.

Versi 2 SDK for Java memiliki perubahan berikut dari versi 1.
+ Operasi dengan beberapa halaman respons sekarang memiliki `Paginator` metode untuk iterasi secara otomatis atas semua item dalam respons.
+ Anda tidak dapat mengubah permintaan dan tanggapan.
+ Anda harus membuat permintaan dan tanggapan dengan metode pembangun statis alih-alih konstruktor. Misalnya, versi 1 `new PutItemRequest().withTableName(...)` sekarang`PutItemRequest.builder().tableName(...).build()`.
+ Operasi mendukung cara singkat untuk membuat permintaan:`dynamoDbClient.putItem(request -> request.tableName(...))`.

Bagian berikut menjelaskan perubahan spesifik antara versi 1 dan versi 2. Beberapa perubahan jenis parameter dapat dikonversi secara otomatis menggunakan [alat migrasi](migration-tool.md), sementara perubahan lainnya memerlukan pembaruan manual untuk kode Anda.

# Perubahan parameter tanggal
<a name="migration-date-parameters"></a>

Dalam versi 1, banyak operasi menerima `java.util.Date` objek untuk parameter berbasis waktu. Di versi 2, operasi ini menggunakan `java.time.Instant` objek sebagai gantinya.

Anda dapat mengonversi `Date` parameter secara otomatis menggunakan [alat migrasi](migration-tool.md), atau Anda dapat mengonversinya secara manual dengan memanggil `toInstant()` metode pada `Date` objek Anda.

**Example - Hasilkan URL presigned dengan tanggal kedaluwarsa di versi 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 - Hasilkan URL yang telah ditetapkan sebelumnya dengan instan kedaluwarsa di versi 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());
```

# Perubahan penanganan data biner
<a name="migration-binary-data"></a>

Dalam versi 1, data biner ditangani menggunakan `ByteBuffer` objek secara langsung. Di versi 2, SDK menggunakan `SdkBytes` objek yang menyediakan cara yang lebih nyaman dan aman untuk bekerja dengan data biner.

Anda dapat `SdkBytes` mengonversinya `ByteBuffer` secara otomatis menggunakan [alat migrasi](migration-tool.md), atau mengonversinya secara manual dengan memanggil `asByteBuffer()` `SdkBytes` objek yang dikembalikan.

**Example - Dapatkan data biner dari atribut pesan di versi 1**  

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

**Example - Dapatkan data biner dari atribut pesan di versi 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());
```

# Perubahan parameter batas waktu
<a name="migration-timeout-parameters"></a>

Di versi 1, nilai batas waktu ditentukan sebagai nilai integer yang mewakili milidetik. Dalam versi 2, parameter batas waktu menggunakan `java.time.Duration` objek untuk keamanan dan kejelasan tipe yang lebih baik.

Anda dapat mengonversi nilai batas waktu numerik secara otomatis menggunakan [alat migrasi](migration-tool.md), atau Anda dapat mengonversinya secara manual dengan membungkus nilai numerik Anda dengan metode pabrik yang sesuai. `Duration`

**Example - Tetapkan batas waktu permintaan di versi 1**  

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

**Example - Tetapkan batas waktu permintaan di versi 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
```

Anda dapat menggunakan metode `Duration` pabrik berikut untuk nilai batas waktu:
+ `Duration.ofMillis(long millis)`- Untuk nilai milidetik.
+ `Duration.ofSeconds(long seconds)`- Untuk nilai kedua.
+ `Duration.ofMinutes(long minutes)`- Untuk nilai menit.

# Perbedaan operasi streaming antara 1.x dan 2.x dari AWS SDK untuk Java
<a name="migration-streaming-ops"></a>

Operasi streaming, seperti Amazon S3 `getObject` dan `putObject` metode, mendukung non-pemblokiran I/O di SDK versi 2.x. Akibatnya, objek model permintaan dan respons tidak lagi mengambil `InputStream` sebagai parameter. Sebagai gantinya, untuk permintaan sinkron objek permintaan menerima`RequestBody`, yang merupakan aliran byte. Setara asinkron menerima sebuah. `AsyncRequestBody`

**Example `putObject`operasi Amazon S3 di 1.x**  

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

**Example `putObject`operasi Amazon S3 di 2.x**  

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

Objek respons streaming menerima a `ResponseTransformer` untuk klien sinkron dan untuk klien asinkron di V2. `AsyncResponseTransformer`

**Example `getObject`operasi Amazon S3 di 1.x**  

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

**Example `getObject`operasi Amazon S3 di 2.x**  

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

Dalam SDK for Java 2.x, operasi respons streaming memiliki metode untuk memuat `AsBytes` respons ke dalam memori dan menyederhanakan konversi tipe umum dalam memori.

# Perbedaan serialisasi antara 1.x dan 2.x dari AWS SDK untuk Java
<a name="migration-serialization-changes"></a>

## Daftar objek untuk meminta perbedaan parameter
<a name="serialization-diffs-list-obj-to-req-param"></a>

SDK for Java v1.x dan v2.x berbeda dalam cara mereka membuat serial objek List untuk meminta parameter.

SDK for Java 1.x tidak membuat serial daftar kosong, sedangkan SDK for Java 2.x membuat serial daftar kosong sebagai parameter kosong.

Misalnya, pertimbangkan layanan dengan `SampleOperation` yang membutuhkan a`SampleRequest`. `SampleRequest`Menerima dua parameter—tipe String `str1` dan tipe List `listParam` —seperti yang ditunjukkan pada contoh berikut.

**Example dari `SampleOperation` dalam 1.x**  

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

sampleServiceV1Client.sampleOperation(v1Request);
```
Pencatatan tingkat kabel menunjukkan bahwa `listParam` parameter tidak diserialisasi.  

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

**Example dari `SampleOperation` dalam 2.x**  

```
sampleServiceV2Client.sampleOperation(b -> b
    .str1("TestName"));
```
Pencatatan tingkat kabel menunjukkan bahwa `listParam` parameter diserialisasikan tanpa nilai.  

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

## POJOs di V1 dibandingkan dengan pembangun di V2
<a name="serialization-json-objects"></a>

[Karena SDK for Java V1 menggunakan kelas POJO yang bisa berubah, pustaka serialisasi dan deserialisasi — seperti Jackson — dapat menggunakan objek model secara langsung.](https://github.com/FasterXML/jackson-docs) 

V2 SDK for Java, sebaliknya, menggunakan objek model yang tidak dapat diubah. Anda harus menggunakan pembangun perantara untuk melakukan de/serialisasi.

Contoh berikut menunjukkan perbedaan antara panggilan `headBucket` API de/serializing dengan V1 dan V2 menggunakan 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();
    }
```

# Perbedaan deserialisasi antara 1.x dan 2.x dari AWS SDK untuk Java
<a name="migration-deserialization-changes"></a>

## Koleksi kosong di V2 dibandingkan dengan `nulls` di V1
<a name="deserialization-diffs-list-obj-to-req-param"></a>

SDK for Java v1.x dan v2.x berbeda dalam cara mereka mendeserialisasi respons JSON dengan daftar dan peta yang kosong.

Saat SDK menerima respons dengan properti yang hilang yang dimodelkan sebagai daftar atau peta, V1 mendeserialisasi properti yang hilang`null`, sedangkan V2 mendeserialisasi properti ke objek koleksi kosong yang tidak dapat diubah.

Misalnya, pertimbangkan respons yang dikembalikan untuk `describeTable` metode dari klien DynamoDB. Metode contoh berikut berisi klien DynamoDB V2 dan klien DynamoDB V1 yang keduanya mengeksekusi metode pada tabel yang tidak memiliki indeks `describeTable` sekunder global

**Example deserialisasi properti yang dimodelkan sebagai daftar yang hilang dalam respons**  

```
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>");
    }
}
```
Berikut ini menunjukkan output yang dicatat:  

```
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 mengambil pendekatan idiomatik dengan deserialisasi daftar kosong dan peta ke koleksi kosong yang tidak dapat diubah alih-alih kembali`null`, mempromosikan kode yang lebih aman dan lebih ringkas. Dengan V2, Anda dapat memeriksa apakah layanan mengembalikan atribut yang dimodelkan sebagai daftar atau peta dengan `has*` metode, seperti yang `hasGlobalSecondaryIndexes` ditunjukkan pada contoh sebelumnya.

Pendekatan ini menghindari kebutuhan akan `null` pemeriksaan eksplisit dan penyelarasan dengan praktik terbaik Java modern untuk menangani struktur data yang tidak ada atau kosong.

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

Respons JSON untuk `describeTable` metode dari klien V1 dan V2 tidak `GlobalSecondaryIndexes` mengandung atribut:

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

# Perubahan pengecualian
<a name="migration-exception-changes"></a>

Nama kelas pengecualian, strukturnya, dan hubungannya telah berubah. `software.amazon.awssdk.core.exception.SdkException`adalah `Exception` kelas dasar baru yang diperluas oleh semua pengecualian lainnya.

Tabel ini memetakan perubahan nama kelas pengecualian.


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

Tabel berikut memetakan metode pada kelas pengecualian antara versi 1.x dan 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`   | 

# Perubahan khusus layanan
<a name="migration-service-changes"></a>

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

SDK for Java 2.x menonaktifkan akses anonim secara default. Akibatnya, Anda harus mengaktifkan akses anonim dengan menggunakan file`AnonymousCredentialsProvider`.

### Perubahan nama operasi
<a name="s3-op-name-changes"></a>

Banyak nama operasi untuk Amazon S3 klien telah berubah di AWS SDK untuk Java 2.x. Dalam versi 1.x, Amazon S3 klien tidak dihasilkan langsung dari API layanan. Hal ini mengakibatkan ketidakkonsistenan antara operasi SDK dan API layanan. Di versi 2.x, kami sekarang menghasilkan Amazon S3 klien agar lebih konsisten dengan API layanan.

Tabel berikut menunjukkan nama operasi dalam dua versi.


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

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

Klien SNS tidak dapat lagi mengakses topik SNS di Wilayah selain Wilayah yang dikonfigurasi untuk diakses.

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

Klien SQS tidak dapat lagi mengakses antrian SQS di Wilayah selain Wilayah yang dikonfigurasi untuk diakses.

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

SDK for Java 2.x `RdsUtilities#generateAuthenticationToken` digunakan sebagai pengganti `RdsIamAuthTokenGenerator` kelas di 1.x.

# Perubahan dalam bekerja dengan Amazon S3 dari versi 1 ke versi 2 AWS SDK untuk Java
<a name="migration-s3"></a>

 AWS SDK for Java 2.x Memperkenalkan perubahan signifikan pada klien S3, termasuk struktur paket baru, nama kelas yang diperbarui, dan tanda tangan metode yang direvisi. Meskipun banyak metode dapat dimigrasi secara otomatis dari V1 ke V2 menggunakan [alat migrasi](migration-tool.md), beberapa memerlukan migrasi manual, seperti `listNextBatchOfObjects` dan. `selectObjectContent` Selain itu, V2 menggantikan kelas V1 tertentu seperti `AccessControlList` dan `CannedAccessControlList` dengan implementasi baru.

**Topics**
+ [Perbedaan klien S3 antara versi 1 dan versi 2 AWS SDK untuk Java](migration-s3-client.md)
+ [Migrasikan Manajer Transfer dari versi 1 ke versi 2 AWS SDK untuk Java](migration-s3-transfer-manager.md)
+ [Perubahan dalam mengurai Amazon URIs S3 dari versi 1 ke versi 2](migration-s3-uri-parser.md)
+ [Perubahan pada API Pemberitahuan Acara S3 dari versi 1 ke versi 2](migration-s3-event-notification.md)

# Perbedaan klien S3 antara versi 1 dan versi 2 AWS SDK untuk Java
<a name="migration-s3-client"></a>

Dalam topik ini, perbedaan antara klien S3 di versi 1 dan versi 2 SDK for Java diatur oleh bagaimana alat [migrasi dapat mengotomatiskan migrasi](migration-tool.md). Alat ini mendukung migrasi sebagian besar metode dari V1 ke V2, tetapi beberapa metode memerlukan migrasi manual. Selain metode klien S3, beberapa kelas S3 V1 tidak memiliki setara V2 langsung yang mengharuskan Anda untuk memigrasikannya secara manual.

**Contents**
+ [Contoh metode V1 yang didukung oleh alat migrasi](#methods-tool-migration)
  + [`putObject`](#V1-V2-putobject)
  + [`getObject`](#V1-V2-getobject)
+ [Metode V1 yang membutuhkan migrasi manual](#s3-methods-manual-migration)
  + [`getObject` menggunakan `S3ObjectId`](#V1s-getObject-using-V1s-S3ObjectId)
  + [`getETag` menggunakan `ObjectMetadata`](#V1s-ObjectMetadata-using-V1s-getETag)
  + [`listNextBatchOfObjects`](#V1-listNextBatchOfObjects)
  + [`listNextBatchOfVersions`](#V1-listNextBatchOfVersions)
  + [`selectObjectContent`](#V1-selectObjectContent)
  + [`setBucketAcl`](#V1-setBucketAcl)
  + [`setObjectAcl`](#V1-setObjectAcl)
  + [`initiateMultipartUpload`](#V1-initiateMultipartUpload)
    + [Contoh migrasi](#V1-initiateMultipartUpload-migration-ex)
    + [Perbedaan implementasi](#V1-initiateMultipartUpload-impl-diffs)
  + [`setRegion`](#V1-setRegion)
  + [`setS3ClientOptions(S3ClientOptions clientOptions)`](#V1-setS3ClientOptions)
  + [`setBucketLoggingConfiguration`](#V1-setBucketLoggingConfiguration)
  + [`setBucketLifecycleConfiguration`](#V1-setBucketLifecycleConfiguration)
  + [`setBucketTaggingConfiguration`](#V1-setBucketTaggingConfiguration)
+ [Kelas V1 yang membutuhkan migrasi manual](#s3-classes-manual-migration)
  + [`AccessControlList`](#V1-AccessControlList)
  + [`CannedAccessControlList`](#V1-CannedAccessControlList)
  + [`BucketNotificationConfiguration`](#V1-BucketNotificationConfiguration)
  + [`MultiFactorAuthentication`](#V1-MultifactorAuthentication)

## Contoh metode V1 yang didukung oleh alat migrasi
<a name="methods-tool-migration"></a>

Alat migrasi secara otomatis memigrasikan sebagian besar metode dari V1 ke V2. Metode `putObject` dan `getObject` metode adalah dua contoh.

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

## Metode V1 yang membutuhkan migrasi manual
<a name="s3-methods-manual-migration"></a>

Anda perlu memigrasikan metode klien V1 S3 berikut secara manual. Saat Anda menggunakan alat migrasi, Anda melihat komentar di file Java keluaran V2 yang mengarahkan Anda ke topik ini.

### V1 `getObject` menggunakan V1 `S3ObjectId` ke V2 `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);
```

### V1 `getETag()` menggunakan V1 `ObjectMetadata` ke V2 `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());
```

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

### V1 `listNextBatchOfVersions` ke V2 `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.
```

### `acl`Metode V1 `setBucketAcl` ke V2 pada `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);
```

### `acl`Metode V1 `setObjectAcl` ke V2 pada `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);
```

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

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

#### Perbedaan implementasi
<a name="V1-initiateMultipartUpload-impl-diffs"></a>

Nilai `Content-Type` header default untuk metode berikut berbeda seperti yang ditunjukkan pada tabel berikut.


****  

| Versi SDK | Metode | `Content-Type`Nilai default | 
| --- | --- | --- | 
| versi 1 | [initiateMultipartUpload](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/AmazonS3Client.html#initiateMultipartUpload-com.amazonaws.services.s3.model.InitiateMultipartUploadRequest-) | application/octet-stream | 
| versi 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`Metode V1 `setRegion` ke V2 pada pembuat klien
<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>

Alih-alih menggunakan satu `S3ClientOptions` objek dengan `setS3ClientOptions` metode ini, V2 menyediakan metode pada pembuat klien untuk mengatur opsi.

### V1 `setBucketLoggingConfiguration` ke V2 `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);
```

### V1 `setBucketLifecycleConfiguration` ke V2 `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);
```

### V1 `setBucketTaggingConfiguration` ke V2 `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);
```

## Kelas V1 yang membutuhkan migrasi manual
<a name="s3-classes-manual-migration"></a>

### V1 `AccessControlList` ke 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();
```

### Enum V1 ke V2 dan `CannedAccessControlList` enum `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));
```

### V1 `BucketNotificationConfiguration` ke V2 `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));
```

### `mfa`Metode V1 `MultiFactorAuthentication` ke V2 pada pembuat permintaan
<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);
```

# Migrasikan Manajer Transfer dari versi 1 ke versi 2 AWS SDK untuk Java
<a name="migration-s3-transfer-manager"></a>

Panduan migrasi ini mencakup perbedaan utama antara Transfer Manager v1 dan S3 Transfer Manager v2, termasuk perubahan konstruktor, pemetaan metode, dan contoh kode untuk operasi umum. Setelah meninjau perbedaan ini, Anda dapat berhasil memigrasikan kode Transfer Manager yang ada untuk memanfaatkan peningkatan kinerja dan operasi asinkron di v2.

**Tentang alat migrasi AWS SDK**  
 AWS SDK untuk Java Ini menyediakan [alat migrasi](migration-tool.md) otomatis yang dapat memigrasikan sebagian besar API Manajer Transfer v1 ke v2. Namun, alat migrasi tidak mendukung beberapa fitur Manajer Transfer v1. Untuk kasus ini, Anda perlu memigrasikan kode Transfer Manager secara manual menggunakan panduan dalam topik ini.  
Sepanjang panduan ini, **Status Migrasi** menunjukkan apakah alat migrasi dapat secara otomatis memigrasikan konstruktor, metode, atau fitur:  
**Didukung**: Alat migrasi dapat secara otomatis mengubah kode ini
**Tidak Didukung**: Anda perlu memigrasi kode secara manual
Bahkan untuk item yang ditandai sebagai “Didukung,” tinjau hasil migrasi dan uji secara menyeluruh. Migrasi Transfer Manager melibatkan perubahan arsitektur yang signifikan dari operasi sinkron ke asinkron.

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

S3 Transfer Manager v2 memperkenalkan perubahan signifikan pada Transfer Manager API. S3 Transfer Manager v2 dibangun di atas operasi asinkron dan memberikan kinerja yang lebih baik, terutama ketika Anda menggunakan klien Amazon S3 berbasis CRT AWS .

### Perbedaan utama
<a name="s3-tm-migration-key-differences"></a>
+ **Package**: `com.amazonaws.services.s3.transfer` → `software.amazon.awssdk.transfer.s3`
+ **Nama kelas**: `TransferManager` → `S3TransferManager`
+ **Ketergantungan klien**: Klien Amazon S3 sinkron → Klien Amazon S3 asinkron () `S3AsyncClient`
+ **Arsitektur**: Operasi sinkron → Operasi asinkron dengan `CompletableFuture`
+ **Kinerja**: Ditingkatkan dengan dukungan AWS klien berbasis CRT

## Perubahan tingkat tinggi
<a name="s3-tm-migration-high-level-changes"></a>


| Aspek | V1 | V2 | 
| --- | --- | --- | 
| Ketergantungan Maven | aws-java-sdk-s3 | s3-transfer-manager | 
| Package | com.amazonaws.services.s3.transfer | software.amazon.awssdk.transfer.s3 | 
| Kelas utama | TransferManager | S3TransferManager | 
| Klien Amazon S3 | AmazonS3(sinkronisasi) | S3AsyncClient(asinkron) | 
| Jenis pengembalian | Operasi pemblokiran | CompletableFuture<T> | 

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

## Migrasi konstruktor klien
<a name="s3-tm-migration-client-constructor"></a>

### Konstruktor yang didukung (migrasi otomatis)
<a name="s3-tm-migration-supported-constructors"></a>


| V1 konstruktor | V2 setara | Status migrasi | 
| --- | --- | --- | 
| new TransferManager() | S3TransferManager.create() | Didukung | 
| TransferManagerBuilder. defaultTransferManager() | S3TransferManager.create() | Didukung | 
| TransferManagerBuilder. standard().build() | S3TransferManager.builder().build() | Didukung | 
| new TransferManager(AWSCredentials) | S3TransferManager.builder() .s3Client(S3AsyncClient.builder() .credentialsProvider(...).build()) .build() | Didukung | 
| new TransferManager( AWSCredentialsProvider) | S3TransferManager.builder() .s3Client(S3AsyncClient.builder() .credentialsProvider(...).build()) .build() | Didukung | 

### Konstruktor yang tidak didukung (diperlukan migrasi manual)
<a name="s3-tm-migration-unsupported-constructors"></a>


| V1 konstruktor | V2 setara | Catatan migrasi | 
| --- | --- | --- | 
| new TransferManager(AmazonS3) | Migrasi manual diperlukan | Buat secara S3AsyncClient terpisah | 
| new TransferManager(AmazonS3, ExecutorService) | Migrasi manual diperlukan | Buat S3AsyncClient dan konfigurasikan eksekutor | 
| new TransferManager(AmazonS3, ExecutorService, boolean) | Migrasi manual diperlukan | shutDownThreadPoolsparameter tidak didukung | 

### Contoh migrasi manual
<a name="s3-tm-migration-manual-examples"></a>

**Kode V1:**

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

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

## Migrasi metode klien
<a name="s3-tm-migration-client-methods"></a>

Saat ini, alat migrasi mendukung dasar `copy``download`,`upload`,`uploadDirectory`,`downloadDirectory`,`resumeDownload`, dan `resumeUpload` metode.

### Metode transfer inti
<a name="s3-tm-migration-core-transfer-methods"></a>


| Metode V1 | Metode V2 | Kembalikan perubahan tipe | Status migrasi | 
| --- | --- | --- | --- | 
| upload(String, String, File) | uploadFile(UploadFileRequest) | Upload → FileUpload | Didukung | 
| upload(PutObjectRequest) | upload(UploadRequest) | Upload → Upload | Didukung | 
| download(String, String, File) | downloadFile(DownloadFileRequest) | Download → FileDownload | Didukung | 
| download(GetObjectRequest, File) | downloadFile(DownloadFileRequest) | Download → FileDownload | Didukung | 
| copy(String, String, String, String) | copy(CopyRequest) | Copy → Copy | Didukung | 
| copy(CopyObjectRequest) | copy(CopyRequest) | Copy → Copy | Didukung | 
| uploadDirectory(String, String, File, boolean) | uploadDirectory( UploadDirectoryRequest) | MultipleFileUpload → DirectoryUpload | Didukung | 
| downloadDirectory(String, String, File) | downloadDirectory( DownloadDirectoryRequest) | MultipleFileDownload → DirectoryDownload | Didukung | 

### Metode transfer yang dapat dilanjutkan
<a name="s3-tm-migration-resumable-methods"></a>


| Metode V1 | Metode V2 | Status migrasi | 
| --- | --- | --- | 
| resumeUpload(PersistableUpload) | resumeUploadFile(ResumableFileUpload) | Didukung | 
| resumeDownload(PersistableDownload) | resumeDownloadFile(ResumableFileDownload) | Didukung | 

### Metode siklus hidup
<a name="s3-tm-migration-lifecycle-methods"></a>


| Metode V1 | Metode V2 | Status migrasi | 
| --- | --- | --- | 
| shutdownNow() | close() | Didukung | 
| shutdownNow(boolean) | Sesuaikan kode secara manual menggunakan close() metode | Tidak Didukung | 

### Metode klien V1 yang tidak didukung
<a name="s3-tm-migration-unsupported-methods"></a>


| Metode V1 | V2 alternatif | Catatan | 
| --- | --- | --- | 
| abortMultipartUploads(String, Date) | Gunakan klien Amazon S3 tingkat rendah | Tidak Didukung | 
| getAmazonS3Client() | Simpan referensi secara terpisah | Tidak Didukung; tidak ada pengambil di v2 | 
| getConfiguration() | Simpan referensi secara terpisah | Tidak Didukung; tidak ada pengambil di v2 | 
| uploadFileList(...) | Lakukan beberapa uploadFile() panggilan | Tidak Didukung | 
| copymetode dengan TransferStateChangeListener parameter | Gunakan TransferListener | [Lihat contoh migrasi manual](#tm-unsupported-client-methods-copy) | 
| downloadmetode dengan S3ProgressListener parameter | Gunakan [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) | [Lihat contoh migrasi manual](#tm-unsupported-client-methods-download) | 
|  `downloadDirectory`metode dengan 4 atau lebih parameter  |  | [Lihat contoh migrasi manual](#tm-unsupported-client-methods-download-dir) | 
| uploadmetode dengan ObjectMetadataProvider parameter | Tetapkan metadata dalam permintaan | [Lihat contoh migrasi manual](#tm-unsupported-client-methods-upload) | 
| uploadDirectorymetode dengan \$1Provider parameter | Tetapkan tag dalam permintaan | [Lihat contoh migrasi manual](#tm-unsupported-client-methods-uploadDirectory) | 

#### `copy`metode dengan `TransferStateChangeListener` parameter
<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`metode dengan `S3ProgressListener` parameter
<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`metode dengan 4 atau lebih parameter
<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`metode dengan `ObjectMetadata` parameter
<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`dengan `ObjectMetadataProvider` parameter
<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);
```

## Migrasi objek model
<a name="s3-tm-migration-model-objects"></a>

Pada tahun AWS SDK for Java 2.x, banyak objek `TransferManager` model telah didesain ulang, dan beberapa metode pengambil dan penyetel yang tersedia di objek model v1 tidak lagi didukung. 

Di v2, Anda dapat menggunakan `CompletableFuture<T>` kelas untuk melakukan tindakan saat transfer selesai — baik berhasil atau dengan pengecualian. Anda dapat menggunakan `join()` metode ini untuk menunggu penyelesaian jika diperlukan. 

### Objek transfer inti
<a name="s3-tm-migration-core-transfer-objects"></a>


| Kelas V1 | Kelas V2 | Status migrasi | 
| --- | --- | --- | 
| TransferManager | S3TransferManager | Didukung | 
| TransferManagerBuilder | S3TransferManager.Builder | Didukung | 
| Transfer | Transfer | Didukung | 
| AbortableTransfer | Transfer | Didukung (tidak ada kelas terpisah) | 
| Copy | Copy | Didukung | 
| Download | FileDownload | Didukung | 
| Upload | Upload / FileUpload | Didukung | 
| MultipleFileDownload | DirectoryDownload | Didukung | 
| MultipleFileUpload | DirectoryUpload | Didukung | 

### Objek ketekunan
<a name="s3-tm-migration-persistence-objects"></a>


| Kelas V1 | Kelas V2 | Status migrasi | 
| --- | --- | --- | 
| PersistableDownload | ResumableFileDownload | Didukung | 
| PersistableUpload | ResumableFileUpload | Didukung | 
| PersistableTransfer | ResumableTransfer | Didukung | 
| PauseResult<T> | Objek langsung yang dapat dilanjutkan | Tidak Didukung | 

### Objek hasil
<a name="s3-tm-migration-result-objects"></a>


| Kelas V1 | Kelas V2 | Status migrasi | 
| --- | --- | --- | 
| CopyResult | CompletedCopy | Didukung | 
| UploadResult | CompletedUpload | Didukung | 

### Objek konfigurasi
<a name="s3-tm-migration-configuration-objects"></a>


| Kelas V1 | Kelas V2 | Status migrasi | 
| --- | --- | --- | 
| TransferManagerConfiguration | MultipartConfiguration(di klien Amazon S3) | Didukung | 
| TransferProgress | TransferProgress \$1 TransferProgressSnapshot | Didukung | 
| KeyFilter | DownloadFilter | Didukung | 

### Objek yang tidak didukung
<a name="s3-tm-migration-unsupported-objects"></a>


| Kelas V1 | V2 alternatif | Status migrasi | 
| --- | --- | --- | 
| PauseStatus | Tidak didukung | Tidak Didukung | 
| UploadContext | Tidak didukung | Tidak Didukung | 
| ObjectCannedAclProvider | PutObjectRequest.builder().acl() | Tidak Didukung | 
| ObjectMetadataProvider | PutObjectRequest.builder().metadata() | Tidak Didukung | 
| ObjectTaggingProvider | PutObjectRequest.builder().tagging() | Tidak Didukung | 
| PresignedUrlDownload | Tidak didukung | Tidak Didukung | 

## TransferManagerBuilder migrasi konfigurasi
<a name="s3-tm-migration-builder-configuration"></a>

### Perubahan konfigurasi
<a name="migration-transfer-manager-config-changes"></a>

Perubahan konfigurasi yang perlu Anda atur untuk manajer transfer v2 bergantung pada klien S3 mana yang Anda gunakan. Anda memiliki pilihan klien S3 AWS berbasis CRT atau klien async S3 berbasis Java standar. Untuk informasi tentang perbedaan, lihat [Klien S3 di AWS SDK for Java 2.x](examples-s3.md#s3-clients) topiknya.

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


****  

| Pengaturan | v1 | v2 - Transfer Manager menggunakan klien AWS S3 berbasis CRT | 
| --- | --- | --- | 
|    (dapatkan pembangun)  |  <pre>TransferManagerBuilder tmBuilder = <br />   TransferManagerBuilder.standard();</pre>  |  <pre>S3TransferManager.Builder tmBuilder  = <br />  S3TransferManager.builder();</pre>  | 
|    Klien S3  |  <pre>tmBuilder.withS3Client(...);<br />tmBuilder.setS3Client(...);</pre>  |  <pre>tmBuilder.s3Client(...);</pre>  | 
|    Pelaksana  |  <pre>tmBuilder.withExecutorFactory(...);<br />tmBuilder.setExecutorFactory(...);</pre>  |  <pre>tmBuilder.executor(...);</pre>  | 
|    Shutdown thread pool  |  <pre>tmBuilder.withShutDownThreadPools(...);<br />tmBuilder.setShutdownThreadPools(...);</pre>  | Tidak didukung. Pelaksana yang disediakan tidak akan dimatikan saat S3TransferManager ditutup | 
|    Ukuran bagian unggahan minimum  |  <pre>tmBuilder.withMinimumUploadPartSize(...);<br />tmBuilder.setMinimumUploadPartSize(...);</pre>  |  <pre>S3AsyncClient s3 = S3AsyncClient.crtBuilder().<br />      minimumPartSizeInBytes(...).build();<br /><br />tmBuilder.s3Client(s3);</pre>  | 
|    Ambang batas unggahan multipart  |  <pre>tmBuilder.withMultipartUploadThreshold(...);<br />tmBuilder.setMultipartUploadThreshold(...);</pre>  |  <pre>S3AsyncClient s3 = S3AsyncClient.crtBuilder().<br />      thresholdInBytes(...).build();<br /><br />tmBuilder.s3Client(s3);</pre>  | 
|    Ukuran bagian salinan minimum  |  <pre>tmBuilder.withMultipartCopyPartSize(...);<br />tmBuilder.setMultipartCopyPartSize(...);</pre>  |  <pre>S3AsyncClient s3 = S3AsyncClient.crtBuilder().<br />      minimumPartSizeInBytes(...).build();<br /><br />tmBuilder.s3Client(s3);</pre>  | 
|    Ambang batas salinan multipart  |  <pre>tmBuilder.withMultipartCopyThreshold(...);<br />tmBuilder.setMultipartCopyThreshold(...);</pre>  |  <pre>S3AsyncClient s3 = S3AsyncClient.crtBuilder().<br />      thresholdInBytes(...).build();<br /><br />tmBuilder.s3Client(s3);</pre>  | 
|    Nonaktifkan unduhan paralel  |  <pre>tmBuilder.withDisableParallelDownloads(...);<br />tmBuilder.setDisableParallelDownloads(...);</pre>  | Nonaktifkan unduhan paralel dengan meneruskan klien S3 berbasis Java standar dengan multipart dinonaktifkan (default) ke manajer transfer.<pre>S3AsyncClient s3 =<br />   S3AsyncClient.builder().build();<br /><br />tmBuilder.s3Client(s3);</pre> | 
|    Selalu hitung multipart md5  |  <pre>tmBuilder.withAlwaysCalculateMultipartMd5(...);<br />tmBuilder.setAlwaysCalculateMultipartMd5(...);</pre>  | Tidak didukung. | 

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


****  

| Pengaturan | v1 | v2 - Transfer Manager menggunakan klien async S3 berbasis Java | 
| --- | --- | --- | 
|    (dapatkan pembangun)  |  <pre>TransferManagerBuilder tmBuilder = <br />   TransferManagerBuilder.standard();</pre>  |  <pre>S3TransferManager.Builder tmBuilder  = <br />  S3TransferManager.builder();</pre>  | 
|    Klien S3  |  <pre>tmBuilder.withS3Client(...);<br />tmBuilder.setS3Client(...);</pre>  |  <pre>tmBuilder.s3Client(...);</pre>  | 
|    Pelaksana  |  <pre>tmBuilder.withExecutorFactory(...);<br />tmBuilder.setExecutorFactory(...);</pre>  |  <pre>tmBuilder.executor(...);</pre>  | 
|    Shutdown thread pool  |  <pre>tmBuilder.withShutDownThreadPools(...);<br />tmBuilder.setShutdownThreadPools(...);</pre>  | Tidak didukung. Pelaksana yang disediakan tidak akan dimatikan saat S3TransferManager ditutup | 
|    Ukuran bagian unggahan minimum  |  <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>  | 
|    Ambang batas unggahan multipart  |  <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>  | 
|    Ukuran bagian salinan minimum  |  <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>  | 
|    Ambang batas salinan multipart  |  <pre>tmBuilder.withMultipartCopyThreshold(...);<br />tmBuilder.setMultipartCopyThreshold(...);</pre>  |  <pre>S3AsyncClient s3 = S3AsyncClient.builder()<br />    .multipartConfiguration(cfg -><br />        cfg.thresholdInBytes(...)).build();<br /><br />tmBuilder.s3Client(s3);</pre>  | 
|    Nonaktifkan unduhan paralel  |  <pre>tmBuilder.withDisableParallelDownloads(...);<br />tmBuilder.setDisableParallelDownloads(...);</pre>  | Nonaktifkan unduhan paralel dengan meneruskan klien S3 berbasis Java standar dengan multipart dinonaktifkan (default) ke manajer transfer.<pre>S3AsyncClient s3 =<br />   S3AsyncClient.builder().build();<br /><br />tmBuilder.s3Client(s3);</pre> | 
|    Selalu hitung multipart md5  |  <pre>tmBuilder.withAlwaysCalculateMultipartMd5(...);<br />tmBuilder.setAlwaysCalculateMultipartMd5(...);</pre>  | Tidak didukung. | 

------

## Perubahan perilaku
<a name="s3-tm-migration-behavior-changes"></a>

### Operasi asinkron
<a name="s3-tm-migration-async-operations"></a>

**V1 (pemblokiran):**

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

**V2 (asinkron):**

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

### Penanganan kesalahan
<a name="s3-tm-migration-error-handling"></a>

**V1:** Transfer direktori gagal sepenuhnya jika ada sub-permintaan yang gagal.

**V2:** Transfer direktori berhasil diselesaikan bahkan jika beberapa sub-permintaan gagal. Periksa kesalahan secara eksplisit:

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

### Unduhan paralel melalui pengambilan rentang byte
<a name="migration-transfer-manager-behavior-fetches"></a>

Ketika fitur transfer paralel otomatis diaktifkan di SDK v2, Manajer Transfer S3 menggunakan [pengambilan rentang byte untuk mengambil](https://docs.aws.amazon.com/AmazonS3/latest/userguide/optimizing-performance-guidelines.html#optimizing-performance-guidelines-get-range) bagian tertentu dari objek secara paralel (unduhan multibagian). Cara objek diunduh dengan v2 tidak tergantung pada bagaimana objek awalnya diunggah. Semua unduhan dapat memperoleh manfaat dari throughput dan konkurensi yang tinggi. 

Sebaliknya, dengan Transfer Manager v1, penting bagaimana objek awalnya diunggah. Manajer Transfer v1 mengambil bagian-bagian objek dengan cara yang sama seperti bagian-bagian yang diunggah. Jika objek awalnya diunggah sebagai objek tunggal, Manajer Transfer v1 tidak dapat mempercepat proses pengunduhan dengan menggunakan sub-permintaan.

# Perubahan dalam mengurai Amazon URIs S3 dari versi 1 ke versi 2
<a name="migration-s3-uri-parser"></a>

Topik ini merinci perubahan dalam mengurai Amazon URIs S3 dari versi 1 (v1) ke versi 2 (v2.).

## Perubahan tingkat tinggi
<a name="migration-3-uri-parser-api-changes"></a>

Untuk mulai mengurai URI S3 di v1, Anda membuat instance `AmazonS3URI` dengan menggunakan konstruktor. Di v2 Anda memanggil `parseUri()` instance`S3Utilities`, untuk mengembalikan file`S3URI`.


****  

| Ubah | v1 | v2 | 
| --- | --- | --- | 
|    Ketergantungan 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>  | 
| Nama paket | com.amazonaws.services.s3 | software.amazon.awssdk.services.s3 | 
| Nama kelas | [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 [Versi terbaru](https://central.sonatype.com/artifact/com.amazonaws/aws-java-sdk-bom). 2 [Versi terbaru](https://central.sonatype.com/artifact/software.amazon.awssdk/bom).

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


| Perilaku | v1 | v2 | 
| --- | --- | --- | 
| Mengurai 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>  | 
| Ambil nama bucket dari URI S3. |  <pre>String bucket = s3Uri.getBucket();</pre>  |  <pre>Optional<String> bucket = s3Uri.bucket();</pre>  | 
| Ambil kuncinya. |  <pre>String key = s3Uri.getKey();</pre>  |  <pre>Optional<String> key = s3Uri.key();</pre>  | 
| Ambil kembali wilayah tersebut. |  <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>  | 
|  Ambil kembali apakah URI S3 adalah gaya jalur.  |  <pre>boolean isPathStyle = s3Uri.isPathStyle();</pre>  |  <pre>boolean isPathStyle = s3Uri.isPathStyle();</pre>  | 
| Ambil ID versi. |  <pre>String versionId = s3Uri.getVersionId();</pre>  |  <pre>Optional<String> versionId = <br />    s3Uri.firstMatchingRawQueryParameter("versionId");</pre>  | 
| Ambil parameter kueri. | N/A |  <pre>Map<String, List<String>> queryParams =<br />    s3Uri.rawQueryParameters();</pre>  | 

### Perubahan perilaku
<a name="migration-s3-uri-parser-behavior-changes"></a>

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

v1 menyediakan opsi untuk meneruskan bendera untuk menentukan apakah URI harus dikodekan URL. Nilai default-nya adalah `true`. 

Di v2, pengkodean URL tidak didukung. Jika Anda bekerja dengan kunci objek atau parameter kueri yang memiliki karakter cadangan atau tidak aman, Anda harus menyandikannya dengan URL. Misalnya Anda perlu mengganti spasi putih `" "` dengan. `%20`

# Perubahan pada API Pemberitahuan Acara S3 dari versi 1 ke versi 2
<a name="migration-s3-event-notification"></a>

Topik ini merinci perubahan dalam S3 Event Notifications API dari versi 1.x (v1) ke versi 2 .x (v2) dari. AWS SDK untuk Java

## Perubahan tingkat tinggi
<a name="migration-s3-event-notification-hl"></a>

### Perubahan struktural
<a name="migration-s3-event-notification-hl-struct"></a>

V1 menggunakan kelas internal statis untuk `EventNotificationRecord` tipe dan atributnya, sedangkan v2 menggunakan kelas publik terpisah untuk `EventNotificationRecord` tipe.

### Perubahan konvensi penamaan
<a name="migration-s3-event-notification-hl-naming"></a>

*Di v1, nama kelas atribut menyertakan akhiran *Entity*, sedangkan v2 menghilangkan akhiran ini untuk penamaan yang lebih sederhana: misalnya, EventData, bukan. *eventDataEntity**

## Perubahan dependensi, paket, dan nama kelas
<a name="migration-s3-event-notification-deps"></a>

Di v1, kelas API Pemberitahuan Acara S3 diimpor secara transitif bersama dengan modul S3 (ArtifactID). `aws-java-sdk-s3` Namun, di v2, Anda perlu menambahkan ketergantungan pada `s3-event-notifications` artefak.


****  

| Ubah | v1 | v2 | 
| --- | --- | --- | 
|    Ketergantungan 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>  | 
| Nama paket | com.amazonaws.services.s3.event | software.amazon.awssdk.eventnotifications.s3.model | 
| Nama kelas |  [S3 EventNotification](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/event/S3EventNotification.html) [S3 .S3 EventNotification EventNotificationRecord](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/event/S3EventNotification.S3EventNotificationRecord.html) [S3EventNotification. GlacierEventDataEntity](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/event/S3EventNotification.GlacierEventDataEntity.html) [S3EventNotification. IntelligentTieringEventDataEntity](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/event/S3EventNotification.IntelligentTieringEventDataEntity.html) [S3EventNotification. LifecycleEventDataEntity](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/event/S3EventNotification.LifecycleEventDataEntity.html) [S3EventNotification. ReplicationEventDataEntity](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/event/S3EventNotification.ReplicationEventDataEntity.html) [S3EventNotification. RequestParametersEntity](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/event/S3EventNotification.RequestParametersEntity.html) [S3EventNotification. ResponseElementsEntity](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/event/S3EventNotification.ResponseElementsEntity.html) [S3EventNotification. RestoreEventDataEntity](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/event/S3EventNotification.RestoreEventDataEntity.html) [S3 .S3 EventNotification BucketEntity](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/event/S3EventNotification.S3BucketEntity.html) [S3 EventNotification .S3Entitas](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/event/S3EventNotification.S3Entity.html) [S3 .S3 EventNotification ObjectEntity](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/event/S3EventNotification.S3ObjectEntity.html) [S3EventNotification. TransitionEventDataEntity](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/event/S3EventNotification.TransitionEventDataEntity.html) [S3EventNotification. UserIdentityEntity](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/event/S3EventNotification.UserIdentityEntity.html)  |   [S3 EventNotification](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/eventnotifications/s3/model/S3EventNotification.html) [S3 EventNotificationRecord](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) [S3Objek](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 [Versi terbaru](https://central.sonatype.com/artifact/software.amazon.awssdk/bom).

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

### JSON ke `S3EventNotification` dan mundur
<a name="migration-s3-event-notification-API-changes-conv"></a>


| Kasus penggunaan | v1 | v2 | 
| --- | --- | --- | 
| Buat S3EventNotification dari JSON String |  <pre>S3EventNotification notification = <br />        S3EventNotification.parseJson(message.body());</pre>  |  <pre>S3EventNotification notification = <br />        S3EventNotification.fromJson(message.body());</pre>  | 
| Konversi S3EventNotification ke JSON String |  <pre>String json = notification.toJson();</pre>  |  <pre>String json = notification.toJson();</pre>  | 

### Atribut akses `S3EventNotification`
<a name="migration-s3-event-notification-API-changes-attr"></a>


| Kasus penggunaan | v1 | v2 | 
| --- | --- | --- | 
| Mengambil catatan dari notifikasi |  <pre>List<S3EventNotification.S3EventNotificationRecord> records = <br />        notifcation.getRecords();</pre>  |  <pre>List<S3EventNotificationRecord> records = <br />        notification.getRecords();</pre>  | 
| Mengambil catatan dari daftar catatan |  <pre>S3EventNotification.S3EventNotificationRecord record = <br />        records.stream().findAny().get();</pre>  |  <pre>S3EventNotificationRecord record = <br />        records.stream().findAny().get();</pre>  | 
| Ambil data peristiwa Glacier |  <pre>S3EventNotification.GlacierEventDataEntity glacierEventData =<br />        record.getGlacierEventData();</pre>  |  <pre>GlacierEventData glacierEventData = <br />        record.getGlacierEventData();</pre>  | 
| Mengambil data peristiwa pemulihan dari peristiwa Glacier |  <pre>S3EventNotification.RestoreEventDataEntity restoreEventData = <br />        glacierEventData.getRestoreEventDataEntity();</pre>  |  <pre>RestoreEventData restoreEventData = <br />        glacierEventData.getRestoreEventData();</pre>  | 
| Ambil parameter permintaan |  <pre>S3EventNotification.RequestParametersEntity requestParameters = <br />        record.getRequestParameters();</pre>  |  <pre>RequestParameters requestParameters = <br />        record.getRequestParameters();</pre>  | 
| Ambil data acara Intelligent Tiering |  <pre>S3EventNotification.IntelligentTieringEventDataEntity tieringEventData = <br />        record.getIntelligentTieringEventData();</pre>  |  <pre>IntelligentTieringEventData intelligentTieringEventData = <br />        record.getIntelligentTieringEventData();</pre>  | 
| Mengambil data peristiwa lifecyle |  <pre>S3EventNotification.LifecycleEventDataEntity lifecycleEventData = <br />        record.getLifecycleEventData();</pre>  |  <pre>LifecycleEventData lifecycleEventData = <br />        record.getLifecycleEventData();</pre>  | 
| Ambil nama acara sebagai enum |  <pre>S3Event eventNameAsEnum = record.getEventNameAsEnum();</pre>  |  <pre>//getEventNameAsEnum does not exist; use 'getEventName()'<br />String eventName = record.getEventName();</pre>  | 
| Ambil data peristiwa replikasi |  <pre>S3EventNotification.ReplicationEventDataEntity replicationEntity = <br />        record.getReplicationEventDataEntity();</pre>  |  <pre>ReplicationEventData replicationEventData = <br />        record.getReplicationEventData();</pre>  | 
| Ambil bucket S3 dan informasi objek |  <pre>S3EventNotification.S3Entity s3 = record.getS3();</pre>  |  <pre>S3 s3 = record.getS3();</pre>  | 
| Mengambil informasi identitas pengguna |  <pre>S3EventNotification.UserIdentityEntity userIdentity = <br />        record.getUserIdentity();</pre>  |  <pre>UserIdentity userIdentity = <br />        record.getUserIdentity();</pre>  | 
| Ambil elemen respons |  <pre>S3EventNotification.ResponseElementsEntity responseElements = <br />        record.getResponseElements();</pre>  |  <pre>ResponseElements responseElements = <br />        record.getResponseElements();</pre>  | 

## Migrasi versi `aws-lambda-java-events` pustaka
<a name="migration-s3-events-notification-lambda-lib"></a>

Jika Anda menggunakan [aws-lambda-java-events](https://github.com/aws/aws-lambda-java-libs/tree/main/aws-lambda-java-events)untuk bekerja dengan peristiwa pemberitahuan S3 dalam fungsi Lambda, kami sarankan Anda meningkatkan ke versi 3.xx terbaru. Versi terbaru menghilangkan semua dependensi pada AWS SDK untuk Java 1.x dari API pemberitahuan acara S3.

Untuk informasi selengkapnya tentang perbedaan dalam menangani notifikasi peristiwa S3 antara `aws-lambda-java-events` pustaka dan SDK for Java 2.x, lihat. [Proses Acara S3 di Lambda dengan Perpustakaan Java: dan AWS SDK for Java 2.x `aws-lambda-java-events`](examples-s3-event-notifications.md#s3-event-notif-processing-options)

# Perubahan file profil
<a name="migration-profile-file"></a>

 AWS SDK for Java 2.x Mem-parsing definisi profil `~/.aws/config` dan `~/.aws/credentials` untuk lebih dekat meniru cara AWS CLI mem-parsing file.

SDK for Java 2.x:
+ Menyelesaikan `~/` atau `~` diikuti oleh pemisah jalur default sistem file di awal jalur dengan memeriksa, secara berurutan,, `$USERPROFILE` (hanya Windows)`$HOME`,`$HOMEDRIVE`, `$HOMEPATH` (hanya Windows), dan kemudian properti sistem. `user.home`
+ Mencari variabel `AWS_SHARED_CREDENTIALS_FILE` lingkungan alih-alih`AWS_CREDENTIAL_PROFILES_FILE`.
+ Diam-diam menjatuhkan definisi profil dalam file konfigurasi tanpa kata `profile` di awal nama profil.
+ Secara diam-diam menjatuhkan definisi profil yang tidak terdiri dari karakter alfanumerik, garis bawah atau tanda hubung (setelah `profile` kata utama dihapus untuk file konfigurasi).
+ Menggabungkan pengaturan definisi profil yang digandakan dalam file yang sama.
+ Menggabungkan pengaturan definisi profil yang digandakan dalam file konfigurasi dan kredensyal.
+ TIDAK menggabungkan pengaturan jika keduanya `[profile foo]` dan `[foo]` ditemukan dalam file yang sama.
+ Menggunakan pengaturan di `[profile foo]` jika `[foo]` keduanya `[profile foo]` dan ditemukan di file konfigurasi.
+ Menggunakan nilai pengaturan duplikat terakhir dalam file dan profil yang sama.
+ Mengenali keduanya `;` dan `#` untuk mendefinisikan komentar.
+ Mengenali `;` dan `#` dalam definisi profil untuk mendefinisikan komentar, bahkan jika karakter berdekatan dengan braket penutup.
+ Mengenali `;` dan `#` mendefinisikan komentar hanya dalam menetapkan nilai hanya jika mereka didahului oleh spasi putih.
+ Mengenali `;` dan `#` dan semua konten berikut dalam menetapkan nilai jika tidak didahului oleh spasi putih.
+ Mempertimbangkan kredensyal berbasis peran sebagai kredensyal prioritas tertinggi. SDK 2.x selalu menggunakan kredensyal berbasis peran jika pengguna menentukan properti. `role_arn`
+ Mempertimbangkan kredensyal berbasis sesi sebagai kredensyal. second-highest-priority SDK 2.x selalu menggunakan kredensyal berbasis sesi jika kredensyal berbasis peran tidak digunakan dan pengguna menentukan properti dan. `aws_access_key_id` `aws_session_token`
+ Menggunakan kredensyal dasar jika kredensyal berbasis peran dan sesi tidak digunakan dan pengguna menentukan properti. `aws_access_key_id`

# Variabel lingkungan dan properti sistem berubah
<a name="migration-env-and-system-props"></a>


| 1.x Variabel Lingkungan | 1.x Properti Sistem | 2.x Variabel Lingkungan | 2.x Properti Sistem | 
| --- | --- | --- | --- | 
| 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 | Tidak didukung ([fitur Permintaan](https://github.com/aws/aws-sdk-java-v2/issues/new)) | Tidak didukung ([fitur Permintaan](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
|   | com.amazonaws.sdk.enableDefaultMetrics | [Tidak didukung](https://github.com/aws/aws-sdk-java-v2/issues/23) | [Tidak didukung](https://github.com/aws/aws-sdk-java-v2/issues/23) | 
|   | com.amazonaws.sdk.enableThrottledRetry | [Tidak didukung](https://github.com/aws/aws-sdk-java-v2/issues/645) | [Tidak didukung](https://github.com/aws/aws-sdk-java-v2/issues/645) | 
|   | com.amazonaws.regions.RegionUtils.fileOverride | Tidak didukung ([fitur Permintaan](https://github.com/aws/aws-sdk-java-v2/issues/new)) | Tidak didukung ([fitur Permintaan](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
|   | com.amazonaws.regions.RegionUtils.disableRemote | Tidak didukung ([fitur Permintaan](https://github.com/aws/aws-sdk-java-v2/issues/new)) | Tidak didukung ([fitur Permintaan](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
|   | com.amazonaws.services.s3.disableImplicitGlobalClients | Tidak didukung ([fitur Permintaan](https://github.com/aws/aws-sdk-java-v2/issues/new)) | Tidak didukung ([fitur Permintaan](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
|   | com.amazonaws.sdk.enableInRegionOptimizedMode | Tidak didukung ([fitur Permintaan](https://github.com/aws/aws-sdk-java-v2/issues/new)) | Tidak didukung ([fitur Permintaan](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 

# Perubahan Pelayan dari versi 1 ke versi 2
<a name="migration-waiters"></a>

Topik ini merinci perubahan fungsionalitas Pelayan dari versi 1 (v1) ke versi 2 (v2).

Tabel berikut menunjukkan perbedaan untuk pelayan DynamoDB secara khusus. Pelayan untuk layanan lain mengikuti pola yang sama.

## Perubahan tingkat tinggi
<a name="migration-waiters-api-changes"></a>

Kelas pelayan berada dalam artefak Maven yang sama dengan layanan. 


| Perubahan | v1 | v2 | 
| --- | --- | --- | 
|    Ketergantungan 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>  | 
| Nama paket | com.amazonaws.services.dynamodbv2.waiters | software.amazon.awssdk.services.dynamodb.waiters | 
| Nama kelas |  `[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/id_id/sdk-for-java/latest/developer-guide/migration-waiters.html)  | 

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

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


| Perubahan | v1 | v2 | 
| --- | --- | --- | 
| Buat pelayan |  <pre>AmazonDynamoDB client = AmazonDynamoDBClientBuilder <br />                            .standard().build();<br />AmazonDynamoDBWaiters waiter = client.waiters();</pre>  | Sinkron:<pre>DynamoDbClient client = DynamoDbClient.create();<br />DynamoDbWaiter waiter = client.waiter();</pre>Asinkron:<pre>DynamoDbAsyncClient asyncClient = <br />        DynamoDbAsyncClient.create();<br />DynamoDbAsyncWaiter waiter = asyncClient.waiter();</pre> | 
| Tunggu sampai ada tabel | Sinkron:<pre>waiter.tableExists()<br />    .run(new WaiterParameters<>(<br />        new DescribeTableRequest(tableName)));</pre>Asinkron:<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> |  Sinkron: <pre>WaiterResponse<DescribeTableResponse> waiterResponse =<br />    waiter.waitUntilTableExists(<br />        r -> r.tableName("myTable"));<br />waiterResponse.matched().response()<br />       .ifPresent(System.out::println);</pre> Asinkron: <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>  | 

## Perubahan konfigurasi
<a name="migration-waiters-config"></a>


| Perubahan | v1 | v2 | 
| --- | --- | --- | 
| Strategi Polling (upaya maksimal dan penundaan tetap) |  <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>  | 

# Perubahan utilitas metadata EC2 dari versi 1 ke versi 2
<a name="migration-imds"></a>

Topik ini merinci perubahan utilitas metadata SDK for Java Amazon Elastic Compute Cloud (EC2) dari versi 1 (v1) ke versi 2 (v2).

## Perubahan tingkat tinggi
<a name="migration-imds-high-level-changes"></a>


****  

| Ubah | v1 | v2 | 
| --- | --- | --- | 
|    Ketergantungan 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>  | 
| Nama paket |  com.amazonaws.util  |  software.amazon.awssdk.imds  | 
| Pendekatan instantiasi |  Gunakan metode utilitas statis; tidak ada instantiasi: <pre>String localHostName = <br />           EC2MetadataUtils.getLocalHostName();</pre>  |  Gunakan metode pabrik statis: <pre>Ec2MetadataClient client = Ec2MetadataClient.create();</pre> Atau gunakan pendekatan pembangun: <pre>Ec2MetadataClient client = Ec2MetadataClient.builder()<br />    .endpointMode(EndpointMode.IPV6)<br />    .build();</pre>  | 
| Jenis klien | Hanya metode utilitas sinkron: EC2MetadataUtils |  Sinkron: `Ec2MetadataClient` Asinkron: `Ec2MetadataAsyncClient`  | 

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

3 Perhatikan deklarasi `apache-client` modul untuk v2. V2 dari utilitas metadata EC2 memerlukan implementasi `SdkHttpClient` antarmuka untuk klien metadata sinkron, atau antarmuka untuk klien metadata `SdkAsyncHttpClient` asinkron. [Konfigurasikan klien HTTP di AWS SDK for Java 2.x](http-configuration.md)Bagian ini menunjukkan daftar klien HTTP yang dapat Anda gunakan.

### Meminta metadata
<a name="migration-imds-fetching-changes"></a>

Di v1, Anda menggunakan metode statis yang tidak menerima parameter untuk meminta metadata untuk sumber daya EC2. Sebaliknya, Anda perlu menentukan jalur ke sumber daya EC2 sebagai parameter di v2. Tabel berikut menunjukkan pendekatan yang berbeda.


****  

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

Lihat [kategori metadata instance](https://docs.aws.amazon.com//AWSEC2/latest/UserGuide/instancedata-data-categories.html) untuk menemukan jalur yang perlu Anda berikan untuk meminta sepotong metadata. 

**catatan**  
Ketika Anda menggunakan klien metadata instance di v2, Anda harus bertujuan untuk menggunakan klien yang sama untuk semua permintaan untuk mengambil metadata.

 

## Perubahan perilaku
<a name="migration-imds-behavior-changes"></a>

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

Pada EC2, Layanan Metadata Instance (IMDS) yang berjalan secara lokal mengembalikan beberapa metadata sebagai string berformat JSON. Salah satu contohnya adalah metadata dinamis dari dokumen [identitas instance](https://docs.aws.amazon.com//AWSEC2/latest/UserGuide/instance-identity-documents.html).

API v1 berisi metode terpisah untuk setiap bagian metadata identitas instance, sedangkan API v2 secara langsung mengembalikan string JSON. Untuk bekerja dengan string JSON, Anda dapat menggunakan [Document API](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/core/document/package-summary.html) untuk mengurai respons dan menavigasi struktur JSON.

Tabel berikut membandingkan bagaimana Anda mengambil metadata dari dokumen identitas instance di v1 dan v2.


****  

| Kasus penggunaan | v1 | v2 | 
| --- | --- | --- | 
| Ambil Wilayah |  <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>  | 
| Ambil id instance |  <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>  | 
| Ambil jenis instance |  <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>  | 

### Perbedaan resolusi titik akhir
<a name="migration-imds-behavior-endpoint-res"></a>

Tabel berikut menunjukkan lokasi yang diperiksa SDK untuk menyelesaikan titik akhir IMDS. Lokasi tercantum dalam prioritas menurun.


****  

| v1 | v2 | 
| --- | --- | 
| Properti sistem: com.amazonaws.sdk.ec2MetadataServiceEndpointOverride | Metode konfigurasi pembangun klien: endpoint(...) | 
| Variabel lingkungan: AWS\$1EC2\$1METADATA\$1SERVICE\$1ENDPOINT | Properti sistem: aws.ec2MetadataServiceEndpoint | 
| Nilai Default: http://169.254.169.254 | File konfigurasi: \$1.aws/config dengan pengaturan ec2\$1metadata\$1service\$1endpoint | 
|  | Nilai yang terkait dengan diselesaikan endpoint-mode  | 
|  | Nilai default: http://169.254.169.254 | 

### Resolusi titik akhir di v2
<a name="migration-imds-behavior-endpoint-res2"></a>

Saat Anda secara eksplisit menetapkan titik akhir dengan menggunakan pembuat, nilai titik akhir tersebut diprioritaskan di atas semua pengaturan lainnya. Ketika kode berikut dijalankan, properti `aws.ec2MetadataServiceEndpoint` sistem dan `ec2_metadata_service_endpoint` pengaturan file konfigurasi diabaikan jika ada.

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

#### Modus titik akhir
<a name="migration-imds-behavior-endpoint-mode"></a>

Dengan v2, Anda dapat menentukan mode titik akhir untuk mengonfigurasi klien metadata agar menggunakan nilai titik akhir default untuk atau. IPv4 IPv6 Mode titik akhir tidak tersedia untuk v1. Nilai default yang digunakan untuk IPv4 adalah `http://169.254.169.254` dan `http://[fd00:ec2::254]` untuk IPv6.

Tabel berikut menunjukkan berbagai cara yang dapat Anda atur mode endpoint dalam urutan prioritas menurun.


****  

|  |  | Kemungkinan nilai | 
| --- | --- | --- | 
| Metode konfigurasi pembangun klien: endpointMode(...) |  <pre>Ec2MetadataClient client = Ec2MetadataClient<br />  .builder()<br />  .endpointMode(EndpointMode.IPV4)<br />  .build();</pre>  | EndpointMode.IPV4, EndpointMode.IPV6 | 
| Properti sistem | aws.ec2MetadataServiceEndpointMode | IPv4, IPv6 (kasus tidak masalah) | 
| Berkas Config: \$1.aws/config | Setelan ec2\$1metadata\$1service\$1endpoint | IPv4, IPv6 (kasus tidak masalah) | 
| Tidak ditentukan dengan cara sebelumnya | IPv4 digunakan |  | 

#### Bagaimana SDK menyelesaikan `endpoint` atau di v2 `endpoint-mode`
<a name="migration-imds-behavior-endpoint-res2-which"></a>

1. SDK menggunakan nilai yang Anda tetapkan dalam kode pada pembuat klien dan mengabaikan pengaturan eksternal apa pun. Karena SDK melempar pengecualian jika keduanya `endpoint` dan `endpointMode` dipanggil pada pembuat klien, SDK menggunakan nilai titik akhir dari metode mana pun yang Anda gunakan.

1. Jika Anda tidak menetapkan nilai dalam kode, SDK melihat ke konfigurasi eksternal—pertama untuk properti sistem dan kemudian untuk pengaturan dalam file konfigurasi. 

   1. SDK pertama-tama memeriksa nilai titik akhir. Jika nilai ditemukan, itu digunakan. 

   1. Jika SDK masih belum menemukan nilai, SDK akan mencari pengaturan mode titik akhir.

1. Terakhir, jika SDK tidak menemukan pengaturan eksternal dan Anda belum mengonfigurasi klien metadata dalam kode, SDK menggunakan nilai. IPv4 `http://169.254.169.254`

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

Amazon EC2 mendefinisikan dua pendekatan untuk mengakses metadata instans:
+ Layanan Metadata Instance Versi 1 (IMDSv1) — Pendekatan permintaan/respons
+ Layanan Metadata Instance Versi 2 (IMDSv2) — Pendekatan berorientasi sesi

Tabel berikut membandingkan bagaimana Java SDKs bekerja dengan IMDS.


****  

| v1 | v2 | 
| --- | --- | 
| IMDSv2 digunakan secara default | Selalu menggunakan IMDSv2 | 
| Mencoba mengambil token sesi untuk setiap permintaan dan kembali IMDSv1 jika gagal mengambil token sesi | Menyimpan token sesi dalam cache internal yang digunakan kembali untuk beberapa permintaan | 

SDK for Java 2.x IMDSv2 hanya mendukung dan tidak kembali ke. IMDSv1

## Perbedaan konfigurasi
<a name="migration-imds-config-diffs"></a>

Tabel berikut mencantumkan opsi konfigurasi yang berbeda.


****  

| Konfigurasi | v1 | v2 | 
| --- | --- | --- | 
| Percobaan ulang | Konfigurasi tidak tersedia | Dapat dikonfigurasi melalui metode pembangun retryPolicy(...) | 
| HTTP | Batas waktu koneksi dapat dikonfigurasi melalui variabel AWS\$1METADATA\$1SERVICE\$1TIMEOUT lingkungan. Defaultnya adalah 1 detik. | Konfigurasi tersedia dengan meneruskan klien HTTP ke metode pembangunhttpClient(...). Batas waktu koneksi default untuk klien HTTP adalah 2 detik. | 

### Contoh konfigurasi HTTP v2
<a name="migration-imds-http-conf-v2-ex"></a>

Contoh berikut menunjukkan bagaimana Anda dapat mengkonfigurasi klien metadata. Contoh ini mengkonfigurasi batas waktu koneksi dan menggunakan klien HTTP Apache.

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

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

# Perubahan di Amazon CloudFront presigning dari versi 1 ke versi 2
<a name="migration-cloudfront-presigning"></a>

Topik ini merinci perubahan di Amazon CloudFront dari versi 1 (v1) ke versi 2 (v2).

## Perubahan tingkat tinggi
<a name="migration-cloudfront-presigning-api-changes"></a>


****  

| Ubah | v1 | v2 | 
| --- | --- | --- | 
|    Ketergantungan 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>  | 
| Nama paket | com.amazonaws.services.cloudfront | software.amazon.awssdk.services.cloudfront | 
| Nama kelas |  [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 [Versi terbaru](https://central.sonatype.com/artifact/com.amazonaws/aws-java-sdk-bom). 2 [Versi terbaru](https://central.sonatype.com/artifact/software.amazon.awssdk/bom).

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


| Perilaku | v1 | v2 | 
| --- | --- | --- | 
| Bangun permintaan kalengan | Argumen diteruskan langsung ke API. |  <pre>CannedSignerRequest cannedRequest =<br />      CannedSignerRequest.builder()<br />                         .resourceUrl(resourceUrl)<br />                         .privateKey(privateKey)<br />                         .keyPairId(keyPairId)<br />                         .expirationDate(expirationDate)<br />                         .build();</pre>  | 
| Membangun permintaan kustom | Argumen diteruskan langsung ke 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>  | 
| Hasilkan URL yang ditandatangani (kalengan) |  <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>  | 
| Hasilkan cookie yang ditandatangani (kustom) |  <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>  | 

### Header cookie yang difaktorkan ulang di v2
<a name="migration-cf-presign-behavior-headers"></a>

Di Java v1, Java SDK memberikan header cookie sebagai file. `Map.Entry<String, String>`

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

Java v2 SDK memberikan seluruh header sebagai satu. `String`

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

# Perubahan API Pembuat Kebijakan IAM dari versi 1 ke versi 2
<a name="migration-iam-policy-builder"></a>

Topik ini merinci perubahan API Pembuat Kebijakan IAM dari versi 1 (v1) ke versi 2 (v2).

## Perubahan tingkat tinggi
<a name="migration-iam-policy-builder-high-level"></a>


****  

| Ubah | v1 | v2 | 
| --- | --- | --- | 
|    Ketergantungan 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>  | 
| Nama paket | com.amazonaws.auth.policy | software.amazon.awssdk.policybuilder.iam | 
| Nama kelas |  [Kebijakan](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/policy/Policy.html) [Pernyataan](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/id_id/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/id_id/sdk-for-java/latest/developer-guide/migration-iam-policy-builder.html)  | 

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

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


****  

| Pengaturan | v1 | v2 | 
| --- | --- | --- | 
|  Membuat instantiasi kebijakan |  <pre>Policy policy = new Policy();</pre>  |  <pre>IamPolicy.Builder policyBuilder = IamPolicy.builder();<br />...<br />IamPolicy policy = policyBuilder.build();</pre>  | 
|    Tetapkan id  |  <pre>policy.withtId(...);<br />policy.setId(...);</pre>  |  <pre>policyBuilder.id(...);</pre>  | 
|    Tetapkan versi  | N/A - menggunakan versi default 2012-10-17 |  <pre>policyBuilder.version(...);</pre>  | 
|    Buat pernyataan  |  <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>  | 
|    Tetapkan pernyataan  |  <pre>policy.withStatements(statement);<br />policy.setStatements(statement);</pre>  |  <pre>policyBuilder.addStatement(statement);</pre>  | 

## Perbedaan dalam membangun pernyataan
<a name="migration-iam-policy-builder-statement"></a>

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

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

SDK v1 memiliki [`enum`tipe](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/policy/Action.html) untuk tindakan layanan yang mewakili `[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)` elemen dalam pernyataan kebijakan. `enum`Jenis berikut adalah beberapa contoh.
+ `[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)`

Contoh berikut menunjukkan `SendMessage` konstanta untuk`SQSActions`.

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

Anda tidak dapat menentukan `[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)` elemen ke pernyataan di v1.

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

Di v2, [IamAction](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/policybuilder/iam/IamAction.html)antarmuka mewakili semua tindakan. Untuk menentukan elemen [tindakan khusus layanan](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_action.html), berikan string ke `create` metode seperti yang ditunjukkan pada kode berikut.

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

Anda dapat menentukan `[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)` untuk pernyataan dengan v2 seperti yang ditunjukkan dalam kode berikut.

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

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

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

Untuk merepresentasikan kondisi pernyataan, SDK v1 menggunakan subclass dari. [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)

Setiap `Condition` subkelas mendefinisikan `enum` tipe perbandingan untuk membantu menentukan kondisi. Misalnya, berikut ini menunjukkan [perbandingan string](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String) *tidak suka* untuk suatu kondisi.

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

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

Di v2, Anda membuat kondisi untuk pernyataan kebijakan dengan menggunakan `[IamCondition](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/policybuilder/iam/IamCondition.html)` dan menyediakan`[IamConditionOperator](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/policybuilder/iam/IamConditionOperator.html)`, yang berisi `enums` untuk semua jenis.

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

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

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

`[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)`Elemen pernyataan kebijakan diwakili oleh `[Resource](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/policy/Resource.html)` kelas SDK. Anda menyediakan ARN sebagai string di konstruktor. Subkelas berikut menyediakan konstruktor kenyamanan.
+ [S3 BucketResource](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/policy/resources/S3BucketResource.html)
+ [S3 ObjectResource](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/policy/resources/S3ObjectResource.html)
+ [SQSQueueSumber Daya](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/policy/resources/SQSQueueResource.html)

Di v1, Anda dapat menentukan `[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)` elemen untuk a `[Resource](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/policy/Resource.html)` dengan memanggil `withIsNotType` metode seperti yang ditunjukkan dalam pernyataan berikut.

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

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

Di v2, Anda membuat `[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)` elemen dengan meneruskan ARN ke metode. `IamResource.create`

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

Sebuah `[IamResource](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/policybuilder/iam/IamResource.html)` dapat diatur sebagai *[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)*elemen seperti yang ditunjukkan dalam cuplikan berikut.

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

`IamResource.ALL`mewakili semua sumber daya. 

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

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

SDK v1 menawarkan `[Principal](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/policy/Principal.html)` kelas-kelas berikut untuk mewakili jenis prinsipal yang mencakup semua anggota:
+ `AllUsers`
+ `AllServices`
+ `AllWebProviders`
+ `All`

Anda tidak dapat menambahkan `[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)` elemen ke pernyataan.

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

Dalam v2, `IamPrincipal.ALL` mewakili semua prinsip:

Untuk mewakili semua anggota dalam jenis kepala sekolah lainnya, gunakan `[IamPrincipalType](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/policybuilder/iam/IamPrincipalType.html)` kelas saat Anda membuat file. `IamPrincipal`
+ `IamPrincipal.create(IamPrincipalType.AWS,"*")`untuk semua pengguna.
+ `IamPrincipal.create(IamPrincipalType.SERVICE,"*")`untuk semua layanan.
+ `IamPrincipal.create(IamPrincipalType.FEDERATED,"*")`untuk semua penyedia web.
+ `IamPrincipal.create(IamPrincipalType.CANONICAL_USER,"*")`untuk semua pengguna kanonik.

Anda dapat menggunakan `addNotPrincipal` metode untuk mewakili `[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)` elemen ketika Anda membuat pernyataan kebijakan seperti yang ditunjukkan dalam pernyataan berikut.

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

# Perubahan dalam bekerja dengan DynamoDB dari versi 1 ke versi 2 AWS SDK untuk Java
<a name="migration-ddb-mapper"></a>



**Topics**
+ [DynamoDB memetakan perbedaan API antara versi 1 dan versi 2 AWS SDK untuk Java](ddb-mapping.md)
+ [Perbedaan API dokumen antara versi 1 dan versi 2 AWS SDK untuk Java](dynamodb-mapping-document-api.md)
+ [Migrasi perpustakaan enkripsi](ddb-encryption-lib-migrate.md)

# DynamoDB memetakan perbedaan API antara versi 1 dan versi 2 AWS SDK untuk Java
<a name="ddb-mapping"></a>

 APIs Pemetaan DynamoDB berubah secara signifikan antara versi 1 dan versi 2. AWS SDK untuk Java Di versi 1, Anda menggunakan `DynamoDBMapper` untuk bekerja dengan Java POJOs. Di versi 2, Anda menggunakan nama metode `DynamoDbEnhancedClient` yang diperbarui, opsi definisi skema yang disempurnakan, dan keamanan tipe yang ditingkatkan.

Perbedaan utama meliputi:
+ Nama metode baru (seperti `getItem` bukan`load`)
+ Pembuatan skema tabel eksplisit
+ Dukungan bawaan untuk operasi sinkron dan asinkron
+ Perubahan cara string dan konfigurasi kosong ditangani

Bagian ini mencakup perubahan API pemetaan, perbedaan anotasi, pembaruan konfigurasi, dan panduan migrasi untuk membantu Anda bertransisi dari v1 `DynamoDBMapper` ke v2. `DynamoDbEnhancedClient`

**Contents**
+ [Perubahan tingkat tinggi dalam pemetaan pustaka dari versi 1 ke versi 2 SDK for Java](dynamodb-mapping-high-level.md)
  + [Perbedaan ketergantungan impor](dynamodb-mapping-high-level.md#dynamodb-mapping-deps)
+ [Perubahan dalam APIs pemetaan DynamoDB antara versi 1 dan versi 2 dari SDK for Java](dynamodb-mapping-api-changes.md)
  + [Buat klien](dynamodb-mapping-api-changes.md#dynamodb-mapping-api-changes-client)
  + [Menetapkan pemetaan ke tabel/indeks DynamoDB](dynamodb-mapping-api-changes.md#dynamodb-mapping-api-changes-mapping)
  + [Operasi tabel](dynamodb-mapping-api-changes.md#dynamodb-mapping-api-changes-tobleops)
  + [Kelas peta dan properti](dynamodb-mapping-api-changes.md#dynamodb-mapping-schemas)
    + [Anotasi kacang](dynamodb-mapping-api-changes.md#dynamodb-mapping-schemas-annos)
    + [V2 anotasi tambahan](dynamodb-mapping-api-changes.md#dynamodb-mapping-schemas-annos-v2-addnl)
  + [Konfigurasi](dynamodb-mapping-api-changes.md#dynamodb-mapping-configuration)
    + [Konfigurasi per operasi](dynamodb-mapping-api-changes.md#dynamodb-mapping-configuration-per-op)
  + [Kondisional](dynamodb-mapping-api-changes.md#dynamodb-mapping-conditionals)
  + [Jenis konversi](dynamodb-mapping-api-changes.md#dynamodb-mapping-type-conv)
    + [Konverter default](dynamodb-mapping-api-changes.md#dynamodb-mapping-type-conv-defaults)
    + [Menetapkan konverter kustom untuk atribut](dynamodb-mapping-api-changes.md#dynamodb-mapping-type-conv-anno)
    + [Tambahkan pabrik atau penyedia konverter tipe](dynamodb-mapping-api-changes.md#dynamodb-mapping-type-conv-factory)
+ [String menangani perbedaan antara versi 1 dan versi 2 dari SDK for Java](dynamodb-migration-string-handling.md)
+ [Perbedaan penguncian optimis antara versi 1 dan versi 2 dari SDK for Java](dynamodb-migrate-optimstic-locking.md)
+ [Perbedaan setter yang lancar antara versi 1 dan versi 2 dari SDK for Java](dynamodb-migrate-fluent-setters.md)

# Perubahan tingkat tinggi dalam pemetaan pustaka dari versi 1 ke versi 2 SDK for Java
<a name="dynamodb-mapping-high-level"></a>

Nama-nama klien pemetaan di setiap pustaka berbeda di V1 dan V2:
+ V1 - Dinamo DBMapper
+ V2 - Klien yang Ditingkatkan DynamoDB

Anda berinteraksi dengan dua pustaka dengan cara yang hampir sama: Anda membuat instance mapper/client dan kemudian memasok POJO Java untuk membaca dan menulis item ini ke APIs tabel DynamoDB. Kedua pustaka juga menawarkan anotasi untuk kelas POJO untuk mengarahkan bagaimana klien menangani POJO. 

Perbedaan penting saat Anda pindah ke V2 meliputi:
+ V2 dan V1 menggunakan nama metode yang berbeda untuk operasi DynamoDB tingkat rendah. Contoh:    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/sdk-for-java/latest/developer-guide/dynamodb-mapping-high-level.html)
+ V2 menawarkan beberapa cara untuk menentukan skema tabel dan memetakan POJOs ke tabel. Anda dapat memilih dari penggunaan anotasi atau skema yang dihasilkan dari kode menggunakan pembangun. V2 juga menawarkan versi skema yang dapat berubah dan tidak dapat diubah.
+ Dengan V2, Anda secara khusus membuat skema tabel sebagai salah satu langkah pertama, sedangkan di V1, skema tabel disimpulkan dari kelas beranotasi sesuai kebutuhan.
+ V2 menyertakan [klien Document API](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/enhanced/dynamodb/document/EnhancedDocument.html) dalam API klien yang disempurnakan, sedangkan V1 menggunakan [API terpisah](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/document/DynamoDB.html).
+ Semua APIs tersedia dalam versi sinkron dan asinkron di V2.

Lihat bagian [pemetaan DynamoDB](dynamodb-enhanced-client.md) dalam panduan ini untuk informasi lebih rinci tentang klien yang disempurnakan V2.

## Perbedaan ketergantungan impor
<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 [Versi terbaru](https://central.sonatype.com/artifact/software.amazon.awssdk/bom).

Di V1, dependensi tunggal mencakup API DynamoDB tingkat rendah dan mapping/document API, sedangkan di V2, Anda menggunakan `dynamodb-enhanced` dependensi artefak untuk mengakses API. mapping/document `dynamodb-enhanced`Modul ini berisi ketergantungan transitif pada modul tingkat rendah`dynamodb`. 

# Perubahan dalam APIs pemetaan DynamoDB antara versi 1 dan versi 2 dari SDK for Java
<a name="dynamodb-mapping-api-changes"></a>

## Buat klien
<a name="dynamodb-mapping-api-changes-client"></a>


****  

| Kasus penggunaan | V1 | V2 | 
| --- | --- | --- | 
|   Instantiasi normal  |  <pre>AmazonDynamoDB standardClient = AmazonDynamoDBClientBuilder.standard()<br />    .withCredentials(credentialsProvider)<br />    .withRegion(Regions.US_EAST_1)<br />    .build();<br />DynamoDBMapper mapper = new DynamoDBMapper(standardClient);</pre>  |  <pre>DynamoDbClient standardClient = DynamoDbClient.builder()<br />    .credentialsProvider(ProfileCredentialsProvider.create())<br />    .region(Region.US_EAST_1)<br />    .build();<br />DynamoDbEnhancedClient enhancedClient = DynamoDbEnhancedClient.builder()<br />    .dynamoDbClient(standardClient)<br />    .build();</pre>  | 
|   Instantiasi minimal  |  <pre>AmazonDynamoDB standardClient = AmazonDynamoDBClientBuilder.standard();<br />DynamoDBMapper mapper = new DynamoDBMapper(standardClient);</pre>  |  <pre>DynamoDbEnhancedClient enhancedClient = DynamoDbEnhancedClient.create();</pre>  | 
|   Dengan trafo atribut\$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 Ekstensi di V2 kira-kira sesuai dengan atribut transformer di V1. [Gunakan ekstensi untuk menyesuaikan operasi DynamoDB Enhanced Client](ddb-en-client-extensions.md)Bagian ini berisi informasi lebih lanjut tentang ekstensi di V2. 

## Menetapkan pemetaan ke tabel/indeks DynamoDB
<a name="dynamodb-mapping-api-changes-mapping"></a>

Di V1, Anda menentukan nama tabel DynamoDB melalui anotasi kacang. Dalam V2, metode pabrik,`table()`, menghasilkan instance `DynamoDbTable` yang mewakili tabel DynamoDB jarak jauh. Parameter pertama dari `table()` metode ini adalah nama tabel DynamoDB.


****  

| Kasus penggunaan | V1 | V2 | 
| --- | --- | --- | 
|   Memetakan kelas Java POJO ke tabel 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>  | 
|   Peta ke indeks sekunder DynamoDB  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/sdk-for-java/latest/developer-guide/dynamodb-mapping-api-changes.html) Bagian dalam DynamoDB Developer Guide yang [membahas metode `query` V1 menunjukkan contoh](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBMapper.Methods.html#DynamoDBMapper.Methods.query) lengkap.  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/sdk-for-java/latest/developer-guide/dynamodb-mapping-api-changes.html) [Gunakan indeks sekunder](ddb-en-client-use-secindex.md)Bagian dalam panduan ini memberikan informasi lebih lanjut.  | 

## Operasi tabel
<a name="dynamodb-mapping-api-changes-tobleops"></a>

Bagian ini menjelaskan operasi APIs yang berbeda antara V1 dan V2 untuk sebagian besar kasus penggunaan standar. 

Di V2, semua operasi yang melibatkan satu tabel dipanggil pada `DynamoDbTable` instance, bukan pada klien yang disempurnakan. Klien yang disempurnakan berisi metode yang dapat menargetkan beberapa tabel. 

Dalam tabel bernama *operasi Tabel* di bawah ini, contoh POJO disebut sebagai `item` atau sebagai tipe tertentu seperti`customer1`. Untuk contoh V2 instance bernama, `table` adalah hasil dari pemanggilan sebelumnya `enhancedClient.table()` yang mengembalikan referensi ke `DynamoDbTable` instance.

Perhatikan bahwa sebagian besar operasi V2 dapat dipanggil dengan pola konsumen yang lancar bahkan ketika tidak ditampilkan. Misalnya, 

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

Untuk operasi V1, *operasi Tabel* (di bawah) berisi beberapa formulir yang umum digunakan dan tidak semua formulir yang kelebihan beban. Misalnya, `load()` metode ini memiliki kelebihan beban berikut:

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

*Operasi tabel* (di bawah) menunjukkan bentuk yang umum digunakan:

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


**Operasi tabel**  

| Kasus penggunaan | V1 | V2 | 
| --- | --- | --- | 
|  Tulis POJO Java ke tabel DynamoDB **Operasi DynamoDB**:, `PutItem` `UpdateItem`  |  <pre>mapper.save(item)<br />mapper.save(item, config)<br />mapper.save(item, saveExpression, config)</pre> Dalam V1, `DynamoDBMapperConfig.SaveBehavior` dan anotasi menentukan metode DynamoDB tingkat rendah mana yang akan dipanggil. Secara umum, `UpdateItem` disebut kecuali saat menggunakan `SaveBehavior.CLOBBER` dan`SaveBehavior.PUT`. Kunci yang dihasilkan secara otomatis adalah kasus penggunaan khusus, dan kadang-kadang keduanya `PutItem` dan `UpdateItem` digunakan.  |  <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>  | 
|  Membaca item dari tabel DynamoDB ke POJO Java **Operasi 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>  | 
|  Menghapus item dari tabel DynamoDB **Operasi DynamoDB:** `DeleteItem`  |  <pre>mapper.delete(item, deleteExpression, config)</pre>  |  <pre>table.deleteItem(deleteItemRequest)<br />table.deleteItem(item)<br />table.deleteItem(key)</pre>  | 
|  Kueri tabel DynamoDB atau indeks sekunder dan kembalikan daftar paginasi **Operasi 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> Gunakan yang dikembalikan `PageIterable.stream()` (pemuatan lambat) untuk respons sinkronisasi dan `PagePublisher.subscribe()` untuk respons asinkron  | 
|  Kueri tabel DynamoDB atau indeks sekunder dan kembalikan daftar **Operasi 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> Gunakan yang dikembalikan `PageIterable.items()` (pemuatan lambat) untuk respons sinkronisasi dan `PagePublisher.items.subscribe()` untuk respons asinkron  | 
|  Memindai tabel DynamoDB atau indeks sekunder dan mengembalikan daftar paginasi **Operasi 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> Gunakan yang dikembalikan `PageIterable.stream()` (pemuatan lambat) untuk respons sinkronisasi dan `PagePublisher.subscribe()` untuk respons asinkron  | 
|  Pindai tabel DynamoDB atau indeks sekunder dan kembalikan daftar **Operasi 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> Gunakan yang dikembalikan `PageIterable.items()` (pemuatan lambat) untuk respons sinkronisasi dan `PagePublisher.items.subscribe()` untuk respons asinkron  | 
|  Baca beberapa item dari beberapa tabel dalam satu batch **Operasi 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>  | 
|  Tulis beberapa item ke beberapa tabel dalam satu batch **Operasi 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>  | 
|  Hapus beberapa item dari beberapa tabel dalam satu batch **Operasi 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>  | 
|  Tulis/hapus beberapa item dalam satu batch **Operasi 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>  | 
|  Lakukan penulisan transaksional **Operasi DynamoDB:** `TransactWriteItems`  |  <pre>mapper.transactionWrite(transactionWriteRequest)</pre>  |  <pre>enhancedClient.transactWriteItems(transasctWriteItemsRequest)</pre>  | 
|  Lakukan pembacaan transaksional **Operasi DynamoDB:** `TransactGetItems`  |  <pre>mapper.transactionLoad(transactionLoadRequest)</pre>  |  <pre>enhancedClient.transactGetItems(transactGetItemsRequest) </pre>  | 
|  Dapatkan hitungan item yang cocok dari kueri **Operasi DynamoDB**: dengan `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>  | 
|  Dapatkan hitungan item yang cocok dari pemindaian **Operasi DynamoDB**: dengan `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>  | 
|  Buat tabel di DynamoDB sesuai dengan kelas POJO **Operasi DynamoDB:** `CreateTable`  |  <pre>mapper.generateCreateTableRequest(Customer.class)</pre> Pernyataan sebelumnya menghasilkan permintaan tabel buat tingkat rendah; pengguna harus memanggil klien `createTable` 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>  | 
|  Lakukan pemindaian paralel di DynamoDB **Operasi `Scan` DynamoDB**: dengan dan parameter `Segment` `TotalSegments`  |  <pre>mapper.parallelScan(Customer.class, <br />                    scanExpression, <br />                    numTotalSegments)</pre>  |  Pengguna diminta untuk menangani thread pekerja dan memanggil `scan` untuk setiap segmen: <pre>table.scan(r -> r.segment(0).totalSegments(5))</pre>  | 
|  Integrasikan Amazon S3 dengan DynamoDB untuk menyimpan tautan S3 cerdas  |  <pre>mapper.createS3Link(bucket, key)<br />mapper.getS3ClientCache()</pre>  |  Tidak didukung karena memasangkan Amazon S3 dan DynamoDB.  | 

## Kelas peta dan properti
<a name="dynamodb-mapping-schemas"></a>

Di V1 dan V2, Anda memetakan kelas ke tabel menggunakan anotasi gaya kacang. V2 juga menawarkan [cara lain untuk mendefinisikan skema](ddb-en-client-adv-features.md#ddb-en-client-adv-features-schm-overview) untuk kasus penggunaan tertentu, seperti bekerja dengan kelas yang tidak dapat diubah.

### Anotasi kacang
<a name="dynamodb-mapping-schemas-annos"></a>

Tabel berikut menunjukkan anotasi kacang setara untuk kasus penggunaan tertentu yang digunakan dalam V1 dan V2. Skenario `Customer` kelas digunakan untuk mengilustrasikan parameter.

Anotasi — serta kelas dan pencacahan — di V2 ikuti konvensi kasus unta dan gunakan '', bukan 'DynamoDB'. DynamoDb


| Kasus penggunaan | V1 | V2 | 
| --- | --- | --- | 
| Petakan kelas ke tabel |  <pre>@DynamoDBTable (tableName ="CustomerTable")</pre>  | <pre>@DynamoDbBean<br />@DynamoDbBean(converterProviders = {...})</pre>Nama tabel didefinisikan saat memanggil DynamoDbEnhancedClient\$1table() metode. | 
| Menunjuk anggota kelas sebagai atribut tabel  |  <pre>@DynamoDBAttribute(attributeName = "customerName")</pre>  |  <pre>@DynamoDbAttribute("customerName") </pre>  | 
| Menunjuk anggota kelas adalah kunci hash/partition  |  <pre>@DynamoDBHashKey </pre>  |  <pre>@DynamoDbPartitionKey</pre>  | 
| Menunjuk anggota kelas adalah kunci range/sort  |  <pre>@DynamoDBRangeKey </pre>  |  <pre>@DynamoDbSortKey </pre>  | 
| Menunjuk anggota kelas adalah kunci hash/partisi indeks sekunder |  <pre>@DynamoDBIndexHashKey </pre>  |  <pre>@DynamoDbSecondaryPartitionKey </pre>  | 
| Menunjuk anggota kelas adalah kunci rentang/sortir indeks sekunder |  <pre>@DynamoDBIndexRangeKey </pre>  |  <pre>@DynamoDbSecondarySortKey </pre>  | 
| Abaikan anggota kelas ini saat memetakan ke tabel |  <pre>@DynamoDBIgnore </pre>  |  <pre>@DynamoDbIgnore</pre>  | 
| Tentukan anggota kelas sebagai atribut kunci UUID yang dibuat secara otomatis |  <pre>@DynamoDBAutoGeneratedKey</pre>  |  <pre>@DynamoDbAutoGeneratedUuid </pre> Ekstensi yang menyediakan ini tidak dimuat secara default; Anda harus menambahkan ekstensi ke pembuat klien.  | 
| Tentukan anggota kelas sebagai atribut stempel waktu yang dibuat secara otomatis |  <pre>@DynamoDBAutoGeneratedTimestamp</pre>  |  <pre>@DynamoDbAutoGeneratedTimestampAttribute</pre> Ekstensi yang menyediakan ini tidak dimuat secara default; Anda harus menambahkan ekstensi ke pembuat klien.  | 
| Menunjuk anggota kelas sebagai atribut versi auto-incremented |  <pre>@DynamoDBVersionAttribute</pre>  |  <pre>@DynamoDbVersionAttribute</pre> Ekstensi yang menyediakan ini dimuat secara otomatis.  | 
| Menunjuk anggota kelas sebagai membutuhkan konversi kustom |  <pre>@DynamoDBTypeConverted</pre>  |  <pre>@DynamoDbConvertedBy</pre>  | 
| Menunjuk anggota kelas untuk disimpan sebagai jenis atribut yang berbeda |  <pre>@DynamoDBTyped(<DynamoDBAttributeType>)</pre>  |  Gunakan `AttributeConverter` implementasi. V2 menyediakan banyak konverter bawaan untuk tipe Java umum. Anda juga dapat menerapkan kebiasaan Anda sendiri `AttributeConverter` atau`AttributeConverterProvider`. Lihat [Konversi atribut kontrol](ddb-en-client-adv-features-conversion.md) di panduan ini.  | 
| Tentukan kelas yang dapat diserialisasikan ke dokumen DynamoDB (dokumen gaya JSON) atau sub-dokumen  |  <pre>@DynamoDBDocument</pre>  | Gunakan API Dokumen yang Ditingkatkan. Lihat sumber daya berikut:[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/sdk-for-java/latest/developer-guide/dynamodb-mapping-api-changes.html) | 

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


| Kasus penggunaan | V1 | V2 | 
| --- | --- | --- | 
| Menunjuk anggota kelas untuk tidak disimpan sebagai atribut NULL jika nilai Java adalah null | N/A |  <pre>@DynamoDbIgnoreNulls</pre>  | 
| Menunjuk anggota kelas untuk menjadi objek kosong jika semua atribut adalah null | N/A |  <pre>@DynamoDbPreserveEmptyObject</pre>  | 
| Tentukan tindakan pembaruan khusus untuk anggota kelas | N/A |  <pre>@DynamoDbUpdateBehavior</pre>  | 
| Tentukan kelas yang tidak dapat diubah | N/A |  <pre>@DynamoDbImmutable</pre>  | 
| Menunjuk anggota kelas sebagai atribut counter auto-incremented | N/A |  <pre>@DynamoDbAtomicCounter</pre> Ekstensi yang menyediakan fungsi ini dimuat secara otomatis.  | 

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

Di V1, Anda biasanya mengontrol perilaku tertentu dengan menggunakan instance dari. `DynamoDBMapperConfig` Anda dapat menyediakan objek konfigurasi baik ketika Anda membuat mapper atau ketika Anda membuat permintaan. Dalam V2, konfigurasi khusus untuk objek permintaan untuk operasi.


| Kasus penggunaan | V1 | Default di V1 | V2 | 
| --- | --- | --- | --- | 
|  |  <pre>DynamoDBMapperConfig.builder()</pre>  |  |  | 
| Strategi load/write coba lagi Batch |  <pre>  .withBatchLoadRetryStrategy(loadRetryStrategy)</pre> <pre>  .withBatchWriteRetryStrategy(writeRetryStrategy)</pre>  | coba lagi item yang gagal | Konfigurasikan strategi coba lagi pada yang mendasarinyaDynamoDBClient. Lihat [Konfigurasikan perilaku coba lagi di AWS SDK for Java 2.x](retry-strategy.md) di panduan ini. | 
| Bacaan yang konsisten |  <pre>  .withConsistentReads(CONSISTENT)</pre>  | EVENTUAL | Secara default, pembacaan konsisten salah untuk operasi baca. Ganti dengan .consistentRead(true) objek permintaan. | 
| Skema konversi dengan set marshallers/unmarshallers |  <pre>  .withConversionSchema(conversionSchema)</pre> Implementasi statis memberikan kompatibilitas mundur dengan versi yang lebih lama.  | V2\$1COMPATIBLE | Tidak berlaku. Ini adalah fitur lama yang mengacu pada bagaimana versi awal DynamoDB (V1) menyimpan tipe data, dan perilaku ini tidak akan dipertahankan di klien yang disempurnakan. Contoh perilaku di DynamoDB V1 adalah menyimpan boolean sebagai Number, bukan sebagai Boolean. | 
| Nama tabel |  <pre>  .withObjectTableNameResolver()<br />  .withTableNameOverride() <br />  .withTableNameResolver()</pre> Implementasi statis memberikan kompatibilitas mundur dengan versi yang lebih lama  | gunakan anotasi atau tebakan dari kelas |  Nama tabel didefinisikan saat memanggil `DynamoDbEnhancedClient#table()` metode.  | 
| Strategi beban pagination |  <pre>  .withPaginationLoadingStrategy(strategy)</pre>  Pilihannya adalah: LAZY\$1`LOADING`,, `EAGER_LOADING` atau `ITERATION_ONLY`  | LAZY\$1LOADING |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/sdk-for-java/latest/developer-guide/dynamodb-mapping-api-changes.html)  | 
| Minta pengumpulan metrik |  <pre>  .withRequestMetricCollector(collector)</pre>  | null | Gunakan metricPublisher() ClientOverrideConfiguration saat membangun klien DynamoDB standar.  | 
| Simpan perilaku |  <pre>  .withSaveBehavior(SaveBehavior.CLOBBER) </pre> Pilihannya adalah `UPDATE``CLOBBER`,,`PUT`,`APPEND_SET`, atau`UPDATE_SKIP_NULL_ATTRIBUTES`.  | UPDATE |  Di V2, Anda menelepon `putItem()` atau `updateItem()` secara eksplisit. `CLOBBER or PUT`: Tindakan yang sesuai di v 2 memanggil`putItem()`. Tidak ada `CLOBBER` konfigurasi khusus. `UPDATE`: Sesuai dengan `updateItem()` `UPDATE_SKIP_NULL_ATTRIBUTES`: Sesuai dengan`updateItem()`. Kontrol perilaku pembaruan dengan setelan permintaan `ignoreNulls` dan anotasi/tag`DynamoDbUpdateBehavior`. `APPEND_SET`: Tidak didukung  | 
| Jenis konverter pabrik |  <pre>  .withTypeConverterFactory(typeConverterFactory) </pre>  | konverter tipe standar |  Atur kacang dengan menggunakan <pre>@DynamoDbBean(converterProviders = {ConverterProvider.class, <br />        DefaultAttributeConverterProvider.class})</pre>  | 

### Konfigurasi per operasi
<a name="dynamodb-mapping-configuration-per-op"></a>

Di V1, beberapa operasi, seperti`query()`, sangat dapat dikonfigurasi melalui objek “ekspresi” yang dikirimkan ke operasi. Contoh:

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

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

Di V2, alih-alih menggunakan objek konfigurasi, Anda menetapkan parameter pada objek permintaan dengan menggunakan pembuat. Contoh:

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

customerTable.query(emailBw);
```

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

Dalam V2, ekspresi kondisional dan penyaringan diekspresikan menggunakan `Expression` objek, yang merangkum kondisi dan pemetaan nama dan filter. 


| Kasus penggunaan | Operasi | V1 | V2 | 
| --- | --- | --- | --- | 
| Kondisi atribut yang diharapkan | save (), delete (), query (), scan () |  <pre>new DynamoDBSaveExpression()<br />  .withExpected(Collections.singletonMap(<br />      "otherAttribute", new ExpectedAttributeValue(false)))<br />  .withConditionalOperator(ConditionalOperator.AND);</pre>  | Usang; gunakan sebagai gantinya. ConditionExpression | 
| Ekspresi kondisi | hapus () |  <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>  | 
| Ekspresi filter | query (), scan () |  <pre>scanExpression<br />  .withFilterExpression("#statename = :state")<br />  .withExpressionAttributeValues(attributeValueMapBuilder.build())<br />  .withExpressionAttributeNames(attributeNameMapBuilder.build())<br /></pre>  |  <pre>Map<String, AttributeValue> values = singletonMap(":key", stringValue("value"));<br />Expression filterExpression =<br />    Expression.builder()<br />        .expression("name = :key")<br />        .expressionValues(values)<br />        .build();<br />QueryEnhancedRequest request = QueryEnhancedRequest.builder()<br />    .filterExpression(filterExpression).build();<br /></pre>  | 
| Ekspresi kondisi untuk kueri | kueri () |  <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>  | 

## Jenis konversi
<a name="dynamodb-mapping-type-conv"></a>

### Konverter default
<a name="dynamodb-mapping-type-conv-defaults"></a>

Di V2, SDK menyediakan satu set konverter default untuk semua tipe umum. Anda dapat mengubah konverter tipe baik di tingkat penyedia keseluruhan maupun untuk satu atribut. Anda dapat menemukan daftar konverter yang tersedia di referensi [AttributeConverter](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/enhanced/dynamodb/AttributeConverter.html)API.

### Menetapkan konverter kustom untuk atribut
<a name="dynamodb-mapping-type-conv-anno"></a>

Di V1, Anda dapat membuat anotasi metode pengambil dengan `@DynamoDBTypeConverted` untuk menentukan kelas yang mengkonversi antara tipe atribut Java dan tipe atribut DynamoDB. Misalnya, `CurrencyFormatConverter` yang mengkonversi antara `Currency` tipe Java dan DynamoDB String dapat diterapkan seperti yang ditunjukkan pada cuplikan berikut.

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

Setara V2 dari cuplikan sebelumnya ditunjukkan di bawah ini.

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

**catatan**  
Di V1, Anda dapat menerapkan anotasi ke atribut itu sendiri, tipe atau anotasi yang ditentukan pengguna, V2 mendukung penerapan anotasi hanya ke pengambil.

### Tambahkan pabrik atau penyedia konverter tipe
<a name="dynamodb-mapping-type-conv-factory"></a>

Di V1, Anda dapat menyediakan set konverter tipe Anda sendiri, atau mengganti tipe yang Anda pedulikan dengan menambahkan pabrik konverter tipe ke konfigurasi. Pabrik konverter tipe meluas`DynamoDBTypeConverterFactory`, dan penggantian dilakukan dengan mendapatkan referensi ke set default dan memperluasnya. Cuplikan berikut menunjukkan cara melakukan ini.

```
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 menyediakan fungsionalitas serupa melalui `@DynamoDbBean` anotasi. Anda dapat memberikan satu `AttributeConverterProvider` atau satu rantai pesanan `AttributeConverterProvider` s. Perhatikan bahwa jika Anda menyediakan rantai penyedia konverter atribut Anda sendiri, Anda akan mengganti penyedia konverter default dan harus memasukkannya ke dalam rantai untuk menggunakan konverter atributnya. 

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

Bagian tentang [konversi atribut](ddb-en-client-adv-features-conversion.md#ddb-en-client-adv-features-conversion-example) dalam panduan ini berisi contoh lengkap untuk V2.

# String menangani perbedaan antara versi 1 dan versi 2 dari SDK for Java
<a name="dynamodb-migration-string-handling"></a>

V1 dan V2 menangani string kosong secara berbeda saat mengirim data ke DynamoDB:
+ **V1**: Mengkonversi string kosong ke nilai null sebelum mengirim ke DynamoDB (menghasilkan tidak ada atribut)
+ **V2**: Mengirim string kosong sebagai nilai string kosong aktual ke DynamoDB

**penting**  
Setelah bermigrasi ke V2, jika Anda tidak ingin string kosong disimpan di DynamoDB, Anda harus menerapkan konverter khusus. Tanpa konverter khusus, V2 menyimpan string kosong sebagai atribut string kosong yang sebenarnya di item DynamoDB Anda, yang berbeda dari perilaku V1 menghilangkan atribut ini sepenuhnya.

**Example konverter khusus untuk V2 yang mengubah atribut string kosong menjadi 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;
    }
}
```



# Perbedaan penguncian optimis antara versi 1 dan versi 2 dari SDK for Java
<a name="dynamodb-migrate-optimstic-locking"></a>

Baik V1 dan V2 menerapkan penguncian optimis dengan anotasi atribut yang menandai satu properti di kelas kacang Anda untuk menyimpan nomor versi.


**Perbedaan perilaku penguncian yang optimis**  

|  | V1 | V2 | 
| --- | --- | --- | 
| Anotasi kelas kacang | @DynamoDBVersionAttribute | @DynamoDbVersionAttribute(perhatikan bahwa V2 menggunakan huruf kecil “b”) | 
| Simpan awal | Atribut nomor versi disetel ke 1. |  Nilai awal untuk atribut versi ditetapkan dengan`@DynamoDbVersionAttribute(startAt = X)`. Nilai default-nya adalah 0.  | 
| Perbarui | Atribut nomor versi bertambah 1 jika pemeriksaan bersyarat memverifikasi bahwa nomor versi objek yang diperbarui cocok dengan nomor dalam database. |  Atribut nomor versi bertambah jika pemeriksaan bersyarat memverifikasi bahwa nomor versi objek yang diperbarui cocok dengan nomor dalam database. Atribut nomor versi ditambah dengan `incrementBy` opsi yang ditetapkan dengan`@DynamoDbVersionAttribute(incrementBy = X)`. Nilai default adalah 1.  | 
| Delete | DynamoDBMappermenambahkan pemeriksaan bersyarat bahwa nomor versi objek yang dihapus cocok dengan nomor versi dalam database. |  V2 tidak tidak secara otomatis menambahkan kondisi untuk operasi penghapusan. Anda harus menambahkan ekspresi kondisi secara manual jika Anda ingin mengontrol perilaku hapus. Dalam contoh berikut `recordVersion` adalah atribut versi kacang. <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>  | 
| Tulis Transaksional dengan Pemeriksaan Kondisi | Anda tidak dapat menggunakan kelas kacang yang dianotasi dengan @DynamoDBVersionAttribute metode. addConditionCheck | Anda dapat menggunakan kelas kacang dengan @DynamoDbVersionAttribute anotasi dalam metode addConditionCheck pembangun untuk transactWriteItems permintaan. | 
| Nonaktifkan | Nonaktifkan penguncian optimis dengan mengubah nilai  DynamoDBMapperConfig.SaveBehavior enumerasi dari ke. UPDATE CLOBBER |  Jangan gunakan `@DynamoDbVersionAttribute` anotasi.  | 

# Perbedaan setter yang lancar antara versi 1 dan versi 2 dari SDK for Java
<a name="dynamodb-migrate-fluent-setters"></a>

Anda dapat menggunakan POJOs dengan penyetel yang lancar di API pemetaan DynamoDB untuk V1 dan dengan V2 sejak versi 2.30.29. 

Misalnya, POJO berikut mengembalikan `Customer` instance dari `setName` metode:

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

Namun, jika Anda menggunakan versi V2 sebelum 2.30.29, `setName` mengembalikan `Customer` instance dengan `name` nilai. `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.
  }
}
```

# Perbedaan API dokumen antara versi 1 dan versi 2 AWS SDK untuk Java
<a name="dynamodb-mapping-document-api"></a>

Document API mendukung bekerja dengan dokumen bergaya JSON sebagai item tunggal dalam tabel DynamoDB. V1 Document API memiliki API yang sesuai di V2, tetapi alih-alih menggunakan klien terpisah untuk API dokumen seperti pada V1, V2 menggabungkan fitur API dokumen dalam klien yang disempurnakan DynamoDB. 

Di V1, [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)kelas mewakili catatan tidak terstruktur dari tabel DynamoDB. Dalam V2, catatan tidak terstruktur diwakili oleh instance [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)kelas. Perhatikan bahwa kunci primer didefinisikan dalam skema tabel untuk V2, dan pada item itu sendiri di V1.

Tabel di bawah ini membandingkan perbedaan antara Dokumen APIs di V1 dan V2.


| Kasus penggunaan | V1 | V2 | 
| --- |--- |--- |
| Buat klien dokumen |  <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>  | 
| Referensi tabel |  <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** | 
| --- |
| Mengkonversi struktur JSON untuk menggunakannya dengan Document API |  <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>  | 
| Masukan JSON |  <pre>documentTable.putItem(item)</pre>  |  <pre>documentTable.putItem(document);</pre>  | 
| Baca 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>  | 

## Referensi API dan panduan untuk dokumen APIs
<a name="dynamodb-mapping-document-api-ref"></a>


|  | V1 | V2 | 
| --- | --- | --- | 
| Referensi API | [Referensi API](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/document/package-summary.html) | [Referensi API](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/enhanced/dynamodb/document/package-summary.html) | 
| Panduan dokumentasi | [Panduan Pengembang Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/JavaDocumentAPIItemCRUD.html) | [API Dokumen yang Ditingkatkan](ddb-en-client-doc-api.md) (panduan ini) | 

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

Expression Specification (Xspec) API yang tersedia di V1 yang membantu membuat ekspresi untuk bekerja dengan data berorientasi dokumen tidak tersedia di V2. V2 menggunakan Expression API, yang bekerja dengan data berorientasi dokumen dan object-to-item data yang dipetakan.


****  

|  | V1 | V2 | 
| --- | --- | --- | 
| Nama API | Spesifikasi Ekspresi (Xspec) API | Ekspresi API | 
| Bekerja dengan | [Metode kelas [Tabel](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/document/Table.html) API Dokumen seperti [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-) dan scan](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/document/Table.html#scan-com.amazonaws.services.dynamodbv2.xspec.ScanExpressionSpec-) |  Kedua APIs DynamoDB Enhanced Client: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/sdk-for-java/latest/developer-guide/ddb-v1-xspec-migrate.html) Untuk kedua jenis APIs, setelah Anda memperoleh [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)instance: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/sdk-for-java/latest/developer-guide/ddb-v1-xspec-migrate.html) Anda menggunakan ekspresi dalam `DynamoDbTable` metode saat Anda membuat objek permintaan. Misalnya dalam `filterExpression` metode [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)  | 
| Sumber daya |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/sdk-for-java/latest/developer-guide/ddb-v1-xspec-migrate.html)  | [Informasi ekspresi](ddb-en-client-expressions.md) dalam Panduan Pengembang Java ini | 

# Migrasi perpustakaan enkripsi
<a name="ddb-encryption-lib-migrate"></a>

Untuk informasi tentang memigrasi pustaka enkripsi agar DynamoDB berfungsi dengan V2 dari Java SDK, lihat Panduan Pengembang Klien Enkripsi Amazon [DynamoDB](https://docs.aws.amazon.com/database-encryption-sdk/latest/devguide/ddb-java-migrate.html).

# Perubahan dalam batch permintaan Amazon SQS otomatis dari versi 1 ke versi 2
<a name="migration-sqs-auto-batching"></a>

Topik ini merinci perubahan dalam pengelompokan permintaan otomatis untuk Amazon SQS antara versi 1 dan versi 2. AWS SDK untuk Java

## Perubahan tingkat tinggi
<a name="migration-sqs-auto-batching-high-level-changes"></a>

 AWS SDK untuk Java 1.x melakukan buffering sisi klien menggunakan `[AmazonSQSBufferedAsyncClient](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/sqs/buffered/AmazonSQSBufferedAsyncClient.html)` kelas terpisah yang memerlukan inisialisasi eksplisit untuk pengelompokan permintaan. 

 AWS SDK for Java 2.x Menyederhanakan dan meningkatkan fungsionalitas buffering dengan. `[SqsAsyncBatchManager](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/sqs/batchmanager/SqsAsyncBatchManager.html)` Implementasi antarmuka ini menyediakan kemampuan batching permintaan otomatis yang terintegrasi langsung dengan standar`[SqsAsyncClient](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/sqs/SqsAsyncClient.html)`. Untuk mempelajari tentang v2`SqsAsyncBatchManager`, lihat [Gunakan batching permintaan otomatis untuk Amazon SQS dengan AWS SDK for Java 2.x](sqs-auto-batch.md) topik di panduan ini.


| Ubah | v1 | v2 | 
| --- | --- | --- | 
|    Ketergantungan 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>  | 
| Nama Package | com.amazonaws.services.sqs.buffered | software.amazon.awssdk.services.sqs.batchmanager | 
| Nama kelas |  `[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 [Versi terbaru](https://central.sonatype.com/artifact/com.amazonaws/aws-java-sdk-bom). 2 [Versi terbaru](https://central.sonatype.com/artifact/software.amazon.awssdk/bom).

## Menggunakan batching permintaan SQS otomatis
<a name="migration-sqs-auto-batching-using"></a>


| Ubah | v1 | v2 | 
| --- | --- | --- | 
| Buat pengelola 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>  | 
| Buat pengelola batch dengan konfigurasi khusus |  <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>  | 
| Kirim pesan |  <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>  | 
| Hapus pesan |  <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>  | 
| Ubah visibilitas pesan |  <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>  | 
| Menerima pesan |  <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>  | 

## Perbedaan tipe pengembalian asinkron
<a name="migration-sqs-auto-batching-asyc-return-type"></a>


| Ubah | v1 | v2 | 
| --- | --- | --- | 
| Jenis pengembalian | Future<ResultType> | CompletableFuture<ResponseType> | 
| Mekanisme panggilan balik | Membutuhkan AsyncHandler dengan onError metode onSuccess dan terpisah | Penggunaan CompletableFuture APIs yang disediakan oleh JDK, sepertiwhenComplete(),, thenCompose() thenApply() | 
| Penanganan pengecualian | Menggunakan AsyncHandler\$1onError() metode | Penggunaan CompletableFuture APIs yang disediakan oleh JDK, seperti,exceptionally(), handle() atau whenComplete() | 
| Pembatalan | Dukungan dasar melalui Future.cancel() | Membatalkan induk CompletableFuture secara otomatis membatalkan semua futures dependen dalam rantai | 

## Perbedaan penanganan penyelesaian asinkron
<a name="migration-sqs-auto-batching-asyc-completion-handling"></a>


| Ubah | v1 | v2 | 
| --- | --- | --- | 
| Implementasi penangan respons |  <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>  | 

## Parameter konfigurasi kunci
<a name="migration-sqs-auto-batching-params"></a>


****  

| Parameter | v1 | v2 | 
| --- | --- | --- | 
| Ukuran batch maksimum | maxBatchSize(default 10 permintaan per batch) | maxBatchSize(default 10 permintaan per batch) | 
| Waktu tunggu Batch | maxBatchOpenMs(default 200 ms) | sendRequestFrequency(default 200 ms) | 
| Batas waktu visibilitas | visibilityTimeoutSeconds(-1 untuk antrian default) | receiveMessageVisibilityTimeout(antrian default) | 
| Waktu tunggu minimum | longPollWaitTimeoutSeconds(20-an kapan longPoll itu benar) | receiveMessageMinWaitDuration(default 50 ms) | 
| Atribut pesan | Atur menggunakan ReceiveMessageRequest | receiveMessageAttributeNames(tidak ada secara default) | 
| Atribut sistem | Atur menggunakan ReceiveMessageRequest | receiveMessageSystemAttributeNames(tidak ada secara default) | 
| Pemungutan suara panjang | longPoll(default benar) | Tidak didukung untuk menghindari koneksi terbuka menunggu sampai server mengirim pesan | 
| Waktu tunggu maksimal untuk polling panjang | longPollWaitTimeoutSeconds(default 20-an) | Tidak didukung untuk menghindari koneksi terbuka menunggu sampai server mengirim pesan | 
| Jumlah maksimum batch penerimaan yang diambil sebelumnya yang disimpan di sisi klien | maxDoneReceiveBatches(10 batch) | Tidak didukung karena ditangani secara internal | 
| Jumlah maksimum batch keluar aktif yang diproses secara bersamaan | maxInflightOutboundBatches(default 5 batch) | Tidak didukung karena ditangani secara internal | 
| Jumlah maksimum batch penerima aktif yang diproses secara bersamaan | maxInflightReceiveBatches(default 10 batch) | Tidak didukung karena ditangani secara internal | 

# Gunakan SDK for Java 1.x dan 2.x side-by-side
<a name="migration-side-by-side"></a>

Anda dapat menggunakan kedua versi AWS SDK untuk Java dalam proyek Anda.

Berikut ini menunjukkan contoh `pom.xml` file untuk proyek yang menggunakan Amazon S3 dari versi 1.x dan DynamoDB dari versi 2.27.21.

**Example Contoh POM**  
Contoh ini menunjukkan entri `pom.xml` file untuk proyek yang menggunakan versi 1.x dan 2.x 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>
```