

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

# Was ist der Unterschied zwischen AWS SDK für Java 1.x und 2.x
<a name="migration-whats-different"></a>

In diesem Abschnitt werden die wichtigsten Änderungen beschrieben, die Sie beachten sollten, wenn Sie eine Anwendung von AWS SDK für Java Version 1.x auf Version 2.x konvertieren.

## Änderung des Paketnamens
<a name="mig-diff-package-name-change"></a>

Eine bemerkenswerte Änderung vom SDK for Java 1.x zum SDK for Java 2.x ist die Änderung des Paketnamens. Paketnamen beginnen mit `software.amazon.awssdk` in SDK 2.x, wohingegen das SDK 1.x verwendet. `com.amazonaws`

Dieselben Namen unterscheiden Maven-Artefakte von SDK 1.x bis SDK 2.x. Maven-Artefakte für das SDK 2.x verwenden die `software.amazon.awssdk` groupId, wohingegen das SDK 1.x die groupId verwendet. `com.amazonaws`

Es gibt einige Fälle, in denen Ihr Code eine `com.amazonaws` Abhängigkeit für ein Projekt erfordert, das ansonsten nur SDK 2.x-Artefakte verwendet. Ein Beispiel hierfür ist, wenn Sie serverseitig AWS Lambda arbeiten. Dies wurde im Abschnitt [Ein Apache Maven-Projekt einrichten](setup-project-maven.md#modules-dependencies) weiter oben in diesem Handbuch gezeigt.

**Anmerkung**  
Verschiedene Paketnamen im SDK 1.x enthalten. `v2` Die Verwendung von bedeutet `v2` in diesem Fall normalerweise, dass der Code im Paket darauf ausgelegt ist, mit Version 2 des Dienstes zu funktionieren.   
Da der vollständige Paketname mit beginnt`com.amazonaws`, handelt es sich um SDK 1.x-Komponenten. Beispiele für diese Paketnamen im SDK 1.x sind:   
`com.amazonaws.services.dynamodbv2`
`com.amazonaws.retry.v2`
`com.amazonaws.services.apigatewayv2`
`com.amazonaws.services.simpleemailv2`

## Version 2.x zu Ihrem Projekt hinzufügen
<a name="adding-v2"></a>

Maven ist die empfohlene Methode zur Verwaltung von Abhängigkeiten bei der AWS SDK für Java Verwendung von 2.x. Um Ihrem Projekt Komponenten der Version 2.x hinzuzufügen, aktualisieren Sie Ihre `pom.xml` Datei mit einer Abhängigkeit vom 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>
```

Sie können auch [Version 1.x und 2.x side-by-side verwenden](migration-side-by-side.md), wenn Sie Ihr Projekt auf Version 2.x migrieren.

## Unveränderlich POJOs
<a name="immutable-classes"></a>

Clients und Operationsanforderungs- und Antwortobjekte sind jetzt unveränderlich und können nach der Erstellung nicht geändert werden. Zur Wiederverwendung einer Anforderungs- oder Antwortvariable müssen Sie ein neues Objekt erstellen, das sie ihr zuweisen können.

**Example Aktualisieren eines Anfrageobjekts in 1.x**  

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

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

**Example Aktualisieren eines Anfrageobjekts in 2.x**  

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

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

## Bessere und bessere Methoden
<a name="setter-getter-methods"></a>

In Version AWS SDK für Java 2.x enthalten die Namen der Setter-Methoden das Präfix or nicht. `set` `with` Zum Beispiel `*.withEndpoint()` ist jetzt. `*.endpoint()`

Getter-Methodennamen verwenden das `get` Präfix nicht.

**Example der Verwendung von Setter-Methoden in 1.x**  

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

**Example der Verwendung von Setter-Methoden in 2.x**  

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

**Example der Verwendung von Getter-Methoden in 1.x**  

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

**Example der Verwendung von Getter-Methoden in 2.x**  

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

## Klassennamen modellieren
<a name="model-classname-changes"></a>

Modellklassennamen, die Dienstantworten repräsentieren, enden mit `Response` in v2 statt mit denen`Result`, die v1 verwendet.

**Example von Klassennamen, die eine Antwort in Version 1 darstellen**  

```
CreateApiKeyResult
AllocateAddressResult
```

**Example von Klassennamen, die eine Antwort in v2 darstellen**  

```
CreateApiKeyResponse
AllocateAddressResponse
```

## Migrationsstatus von Bibliotheken und Dienstprogrammen
<a name="migration-libraries-utilities"></a>

### SDK for Java Java-Bibliotheken und -Dienstprogramme
<a name="migration-java-sdk-libs-utils"></a>

In der folgenden Tabelle ist der Migrationsstatus der Bibliotheken und Dienstprogramme für das SDK for Java aufgeführt. 


| Name der Version 1.12.x | Name der Version 2.x | Seit Version in 2.x | 
| --- | --- | --- | 
| Dynamo DBMapper | [DynamoDbEnhancedClient](dynamodb-enhanced-client.md) | 2.12.0 | 
| Waiter | [Waiter](waiters.md) | 2.15.0 | 
| CloudFrontUrlSigner, CloudFrontCookieSigner | [CloudFrontUtilities](https://aws.amazon.com/blogs/developer/amazon-cloudfront-signed-urls-and-cookies-are-now-supported-in-aws-sdk-for-java-2-x/) | 2.18.33 | 
| TransferManager | [S3TransferManager](transfer-manager.md) | 2.19.0 | 
| EC2-Metadaten-Client |  [EC2-Metadaten-Client](examples-ec2-IMDS.md)  | 2.19.29 | 
| S3-URI-Parser |  [S3-URI-Parser](https://aws.amazon.com/blogs/devops/s3-uri-parsing-is-now-available-in-aws-sdk-for-java-2-x/)  | 2.20.41 | 
| IAM-Richtlinienersteller | [IAM-Richtliniengenerator](feature-iam-policy-builder.md) | 2.20.126 | 
| S3-Ereignisbenachrichtigungen | [S3-Ereignisbenachrichtigungen](examples-s3-event-notifications.md#s3-event-notification-read) | 2.25.11  | 
| Clientseitige Pufferung von Amazon SQS | [Automatische Batching-API für Anfragen für Amazon SQS](sqs-auto-batch.md) | 2.28.0 | 
| Fortschritts-Listener | Fortschritts-Listener | [noch nicht veröffentlicht](https://github.com/aws/aws-sdk-java-v2/issues/25) | 

### Verwandte Bibliotheken
<a name="migration-other-sdks"></a>

In der folgenden Tabelle sind Bibliotheken aufgeführt, die separat veröffentlicht wurden, aber mit dem SDK for Java 2.x funktionieren.


| Name, der mit Version 2.x des SDK for Java verwendet wird | Seit Version | 
| --- | --- | 
|  [Amazon S3 S3-Verschlüsselungsclient](https://docs.aws.amazon.com/amazon-s3-encryption-client/latest/developerguide/what-is-s3-encryption-client.html)  |  3.0.0 1  | 
| [AWS Datenbankverschlüsselungs-SDK für DynamoDB](https://docs.aws.amazon.com/database-encryption-sdk/latest/devguide/ddb-java.html) | 3.0.0 2 | 

#### 1 Amazon S3 S3-Verschlüsselungsclient
<a name="migration-s3-encryption-sdk"></a>

Der Verschlüsselungsclient für Amazon S3 ist mithilfe der folgenden Maven-Abhängigkeit verfügbar.

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

#### 2AWS Datenbankverschlüsselungs-SDK für DynamoDB
<a name="migration-ddb-encryption-sdk"></a>

Das AWS Database Encryption SDK für DynamoDB ist für V2 unter Verwendung der folgenden Maven-Abhängigkeit verfügbar.

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

Informationen zur Verschlüsselungsbibliothek für DynamoDB, die mit Version 1 des Java SDK funktioniert, finden Sie im [AWS Database Encryption SDK Developer Guide](https://docs.aws.amazon.com/database-encryption-sdk/latest/devguide/java.html) (*Amazon DynamoDB Encryption Client for Java*) und in. [GitHub](https://github.com/aws/aws-dynamodb-encryption-java)

[Weitere Informationen zur DynamoDB-Verschlüsselungsbibliothek, die mit Version 2 des Java SDK kompatibel ist, finden Sie im [AWS Database Encryption SDK Developer Guide](https://docs.aws.amazon.com/database-encryption-sdk/latest/devguide/ddb-java.html) und in der GitHub Quelle.](https://github.com/aws/aws-database-encryption-sdk-dynamodb)

Migrationsinformationen zur Verschlüsselungsbibliothek finden Sie im [AWS Database Encryption SDK Developer Guide](https://docs.aws.amazon.com/database-encryption-sdk/latest/devguide/ddb-java-migrate.html).

### Migrationsdetails für Bibliotheken und Dienstprogramme
<a name="migrate-libs-utils-details"></a>
+ [Übertragungsmanager](migration-s3-transfer-manager.md)
+ [EC2-Metadaten-Hilfsprogramm](migration-imds.md)
+ [CloudFrontvorsignieren](migration-cloudfront-presigning.md)
+ [S3-URI-Analyse](migration-s3-uri-parser.md)
+ [DynamoDB mapping/document APIs](migration-ddb-mapper.md) 
+ [IAM-Richtlinienersteller](migration-iam-policy-builder.md)
+ [S3-Ereignisbenachrichtigungen](migration-s3-event-notification.md)
+ Veröffentlichung von SDK-Metriken ([1.x-Dokumentation](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/generating-sdk-metrics.html), [2.x-Dokumentation](metrics.md))

# Client-Änderungen
<a name="migration-clients"></a>

## Entwickler von Kunden
<a name="client-builder"></a>

Sie müssen alle Clients mit der Client-Builder-Methode erstellen. Konstruktoren sind nicht mehr verfügbar.

**Example Erstellen eines Clients in Version 1.x**  

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

**Example Erstellen eines Clients in Version 2.x**  

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

## Klassennamen der Kunden
<a name="class-names"></a>

Alle Client-Klassennamen werden jetzt vollständig in Kamelbuchstaben geschrieben und haben kein Präfix mehr. `Amazon` Diese Änderungen sind entsprechend der in der AWS CLI verwendeten Namen ausgerichtet.

**Example Klassennamen in 1.x**  

```
AmazonDynamoDB
AWSACMPCAAsyncClient
```

**Example Klassennamen in 2.x**  

```
DynamoDbClient
AcmAsyncClient
```


**Änderungen der Client-Klassennamen**  

| 1.x Client | 2.x Kunde | 
| --- | --- | 
| 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 | Nicht unterstützt  | 
| 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 | 

# Standardeinstellungen für die Client-Erstellung
<a name="client-creation-defaults"></a>

In Version 2.x wurden die folgenden Änderungen an der Standardlogik für die Client-Erstellung vorgenommen.
+ Die standardmäßige Anbieterkette für Anmeldeinformationen für S3 umfasst keine anonymen Anmeldeinformationen mehr. Sie müssen den anonymen Zugriff auf S3 manuell angeben, indem Sie den `AnonymousCredentialsProvider` verwenden.
+ Die folgenden Umgebungsvariablen, die sich auf die Erstellung von Standardclients beziehen, unterscheiden sich.    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/de_de/sdk-for-java/latest/developer-guide/client-creation-defaults.html)
+ Die folgenden Systemeigenschaften, die sich auf die Erstellung von Standardclients beziehen, sind unterschiedlich.     
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/de_de/sdk-for-java/latest/developer-guide/client-creation-defaults.html)
+ Version 2.x unterstützt die folgenden Systemeigenschaften nicht.
+     
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/de_de/sdk-for-java/latest/developer-guide/client-creation-defaults.html)
+ Das Laden der Regionskonfiguration aus einer benutzerdefinierten `endpoints.json` Datei wird nicht mehr unterstützt.

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

In 1.x wurde die SDK-Clientkonfiguration geändert, indem eine `ClientConfiguration` Instanz auf dem Client oder Client Builder eingerichtet wurde. In Version 2.x wird die Client-Konfiguration in getrennte Konfigurationsklassen aufgeteilt. Mit den separaten Konfigurationsklassen können Sie unterschiedliche HTTP-Clients für asynchrone Clients und synchrone Clients konfigurieren und trotzdem dieselbe Klasse verwenden. `ClientOverrideConfiguration`

**Example der Client-Konfiguration in Version 1.x**  

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

**Example Synchrone Client-Konfiguration in Version 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 Asynchrone Client-Konfiguration in Version 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();
```

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

### Bemerkenswerte Änderungen
<a name="client-configuration-http-notables"></a>
+ In Version 2.x können Sie ändern, welcher HTTP-Client zur Laufzeit verwendet werden soll, indem Sie eine Implementierung mit `clientBuilder.httpClientBuilder` angeben.
+ Wenn Sie einen HTTP-Client mithilfe von Use `clientBuilder.httpClient` an einen Service Client Builder übergeben, wird der HTTP-Client standardmäßig nicht geschlossen, wenn der Service-Client geschlossen wird. Auf diese Weise können Sie HTTP-Clients von mehreren Serviceclients gemeinsam nutzen.
+ Asynchrone HTTP-Clients verwenden jetzt nicht blockierende I/O.
+ Einige Operationen verwenden jetzt HTTP/2, um die Leistung zu verbessern.

### Änderungen an den Einstellungen
<a name="client-configuration-http-setting-diffs"></a>


| Einstellung | 1.x | 2.x Sync, Apache | 2.x Asynchron, Netty | 
| --- | --- | --- | --- | 
|  |  <pre>ClientConfiguration clientConfig = <br />    new ClientConfiguration()</pre>  |  <pre>ApacheHttpClient.Builder httpClientBuilder = <br />    ApacheHttpClient.builder()</pre>  |  <pre>NettyNioAsyncHttpClient.Builder httpClientBuilder = <br />    NettyNioAsyncHttpClient.builder()</pre>  | 
| Maximale Verbindungen |  <pre>clientConfig.setMaxConnections(...)<br />clientConfig.withMaxConnections(...)</pre>  |  <pre>httpClientBuilder.maxConnections(...)</pre>  |  <pre>httpClientBuilder.maxConcurrency(...)</pre>  | 
| Verbindungstimeout |  <pre>clientConfig.setConnectionTimeout(...)<br />clientConfig.withConnectionTimeout(...)</pre>  |  <pre>httpClientBuilder.connectionTimeout(...)<br />httpClientBuilder.connectionAcquisitionTimeout(...)</pre>  |  <pre>httpClientBuilder.connectionTimeout(...)</pre>  | 
| Socket-Timeout |  <pre>clientConfig.setSocketTimeout(...)<br />clientConfig.withSocketTimeout(...)</pre>  |  <pre>httpClientBuilder.socketTimeout(...)</pre>  |  <pre>httpClientBuilder.writeTimeout(...)<br />httpClientBuilder.readTimeout(...)</pre>  | 
| Verbindung TTL |  <pre>clientConfig.setConnectionTTL(...)<br />clientConfig.withConnectionTTL(...)</pre>  |  <pre>httpClientBuilder.connectionTimeToLive(...)</pre>  |  <pre>httpClientBuilder.connectionTimeToLive(...)</pre>  | 
| Verbindung max. Leerlauf |  <pre>clientConfig.setConnectionMaxIdleMillis(...)<br />clientConfig.withConnectionMaxIdleMillis(...)</pre>  |  <pre>httpClientBuilder.connectionMaxIdleTime(...)</pre>  |  <pre>httpClientBuilder.connectionMaxIdleTime(...)</pre>  | 
| Nach Inaktivität validieren |  <pre>clientConfig.setValidateAfterInactivityMillis(...)<br />clientConfig.withValidateAfterInactivityMillis(...)</pre>  | Nicht unterstützt ([Funktion anfordern](https://github.com/aws/aws-sdk-java-v2/issues/new)) | Nicht unterstützt ([Funktion anfordern](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
| Lokale Adresse |  <pre>clientConfig.setLocalAddress(...)<br />clientConfig.withLocalAddress(...)</pre>  |  <pre>httpClientBuilder.localAddress(...)</pre>  | [Wird nicht unterstützt](https://github.com/aws/aws-sdk-java-v2/issues/857) | 
| Expect-Continue ist aktiviert |  <pre>clientConfig.setUseExpectContinue(...)<br />clientConfig.withUseExpectContinue(...)</pre>  |  <pre>httpClientBuilder.expectContinueEnabled(...)</pre>  | Nicht unterstützt (Funktion [anfordern](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
| Connection Reaper |  <pre>clientConfig.setUseReaper(...)<br />clientConfig.withReaper(...)</pre>  |  <pre>httpClientBuilder.useIdleConnectionReaper(...)</pre>  |  <pre>httpClientBuilder.useIdleConnectionReaper(...)</pre>  | 
|  |  <pre>AmazonDynamoDBClientBuilder.standard()<br />    .withClientConfiguration(clientConfiguration)<br />    .build()</pre>  |  <pre>DynamoDbClient.builder()<br />    .httpClientBuilder(httpClientBuilder)<br />    .build()</pre>  |  <pre>DynamoDbAsyncClient.builder()<br />.httpClientBuilder(httpClientBuilder)<br />.build()</pre>  | 

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


| Einstellungen | 1.x | 2.x Synchronisieren, Apache | 2.x Asynchron, Netty | 
| --- | --- | --- | --- | 
|  |  <pre>ClientConfiguration clientConfig =<br />    new ClientConfiguration()</pre>  |  <pre>ProxyConfiguration.Builder proxyConfig =<br />    ProxyConfiguration.builder()</pre>  |  <pre>ProxyConfiguration.Builder proxyConfig =<br />    ProxyConfiguration.builder()</pre>  | 
| Proxy-Host |  <pre>clientConfig.setProxyHost(...)<br />clientConfig.withProxyHost(...)</pre>  |  <pre>proxyConfig.endpoint(...)</pre>  |  <pre>proxyConfig.host(...)</pre>  | 
| Proxy-Port |  <pre>clientConfig.setProxyPort(...)<br />clientConfig.withProxyPort(...)</pre>  |  <pre>proxyConfig.endpoint(...)</pre> [Der Proxy-Port](http-configuration-apache.md#http-configuration-apache-proxy-conf-ex) ist eingebettet in `endpoint`  |  <pre>proxyConfig.port(...)</pre>  | 
| Proxy-Benutzername |  <pre>clientConfig.setProxyUsername(...)<br />clientConfig.withProxyUsername(...)</pre>  |  <pre>proxyConfig.username(...)</pre>  |  <pre>proxyConfig.username(...)</pre>  | 
| Proxy-Passwort |  <pre>clientConfig.setProxyPassword(...)<br />clientConfig.withProxyPassword(...)</pre>  |  <pre>proxyConfig.password(...)</pre>  |  <pre>proxyConfig.password(...)</pre>  | 
| Proxydomäne |  <pre>clientConfig.setProxyDomain(...)<br />clientConfig.withProxyDomain(...)</pre>  |  <pre>proxyConfig.ntlmDomain(...)</pre>  | Nicht unterstützt ([Funktion anfordern](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
| Proxy-Workstation |  <pre>clientConfig.setProxyWorkspace(...)<br />clientConfig.withProxyWorkstation(...)</pre>  |  <pre>proxyConfig.ntlmWorkstation(...)</pre>  | Nicht unterstützt ([Funktion anfordern](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
| Methoden zur Proxyauthentifizierung |  <pre>clientConfig.setProxyAuthenticationMethods(...)<br />clientConfig.withProxyAuthenticationMethods(...)</pre>  |  [Wird nicht unterstützt](https://github.com/aws/aws-sdk-java-v2/issues/858)  | Nicht unterstützt ([Funktion anfordern](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
| Präemptive grundlegende Proxyauthentifizierung |  <pre>clientConfig.setPreemptiveBasicProxyAuth(...)<br />clientConfig.withPreemptiveBasicProxyAuth(...)</pre>  |  <pre>proxyConfig.preemptiveBasicAuthenticationEnabled(...)</pre>  | Nicht unterstützt (Funktion [anfordern](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
| Hosts ohne Proxy |  <pre>clientConfig.setNonProxyHosts(...)<br />clientConfig.withNonProxyHosts(...)</pre>  |  <pre>proxyConfig.nonProxyHosts(...)</pre>  |  <pre>proxyConfig.nonProxyHosts(...)</pre>  | 
| Socket-Proxy deaktivieren |  <pre>clientConfig.setDisableSocketProxy(...)<br />clientConfig.withDisableSocketProxy(...)</pre>  | Nicht unterstützt ([Funktion anfordern](https://github.com/aws/aws-sdk-java-v2/issues/new)) | Nicht unterstützt ([Funktion anfordern](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>  | 

## Überschreibungen durch den Client
<a name="client-override-config-diffs"></a>


| Einstellung | 1.x | 2.x | 
| --- | --- | --- | 
|  |  <pre>ClientConfiguration clientConfig =<br />    new ClientConfiguration()</pre>  |  <pre>ClientOverrideConfiguration.Builder overrideConfig =<br />    ClientOverrideConfiguration.builder()</pre>  | 
| Präfix des Benutzeragenten |  <pre>clientConfig.setUserAgentPrefix(...)<br />clientConfig.withUserAgentPrefix(...)</pre>  |  <pre>overrideConfig.advancedOption(<br />    SdkAdvancedClientOption.USER_AGENT_PREFIX, ...)</pre>  | 
| Suffix des Benutzeragenten |  <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>  | 
| Zusätzliche Header |  <pre>clientConfig.addHeader(...)<br />clientConfig.withHeader(...)</pre>  |  <pre>overrideConfig.putHeader(...)</pre>  | 
| Anforderungstimeout |  <pre>clientConfig.setRequestTimeout(...)<br />clientConfig.withRequestTimeout(...)</pre>  |  <pre>overrideConfig.apiCallAttemptTimeout(...)</pre>  | 
| Timeout bei der Ausführung des Clients |  <pre>clientConfig.setClientExecutionTimeout(...)<br />clientConfig.withClientExecutionTimeout(...)</pre>  |  <pre>overrideConfig.apiCallTimeout(...)</pre>  | 
| Verwenden Sie Gzip |  <pre>clientConfig.setUseGzip(...)<br />clientConfig.withGzip(...)</pre>  |  Nicht unterstützt ([Funktion anfordern](https://github.com/aws/aws-sdk-java-v2/issues/new))  | 
| Hinweis zur Größe des Socket-Puffers |  <pre>clientConfig.setSocketBufferSizeHints(...)<br />clientConfig.withSocketBufferSizeHints(...)</pre>  | Nicht unterstützt ([Funktion anfordern](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
| Metadaten der Antwort zwischenspeichern |  <pre>clientConfig.setCacheResponseMetadata(...)<br />clientConfig.withCacheResponseMetadata(...)</pre>  | Nicht unterstützt ([Anforderungsfunktion](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
| Größe des Caches für Antwortmetadaten |  <pre>clientConfig.setResponseMetadataCacheSize(...)<br />clientConfig.withResponseMetadataCacheSize(...)</pre>  | Nicht unterstützt ([Anforderungsfunktion](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
| DNS-Auflöser |  <pre>clientConfig.setDnsResolver(...)<br />clientConfig.withDnsResolver(...)</pre>  | Nicht unterstützt ([Funktion anfordern](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
| TCP-Keepalive |  <pre>clientConfig.setUseTcpKeepAlive(...)<br />clientConfig.withTcpKeepAlive(...)</pre>  |  Diese Option ist jetzt in der HTTP-Client-Konfiguration enthalten <pre>- ApacheHttpClient.builder().tcpKeepAlive(true)<br />- NettyNioAsyncHttpClient.builder().tcpKeepAlive(true)</pre>  | 
| Sicher, zufällig |  <pre>clientConfig.setSecureRandom(...)<br />clientConfig.withSecureRandom(...)</pre>  | Nicht unterstützt ([Funktion anfordern](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>  | 

## Wiederholungsversuche vom Client überschreiben
<a name="client-override-retry-config-diffs"></a>


| Einstellung | 1.x | 2.x | 
| --- | --- | --- | 
|  |  <pre>ClientConfiguration clientConfig =<br />    new ClientConfiguration()</pre>  |  <pre>ClientOverrideConfiguration.Builder overrideConfigBuilder = <br />    ClientOverrideConfiguration.builder();</pre>  | 
| Max. Anzahl der Wiederholungsversuche |  <pre>clientConfig.setMaxErrorRetry(...)<br />clientConfig.withMaxErrorRetry(...)</pre>  |  <pre>// Configure the default retry strategy.<br />overrideConfigBuilder.retryStrategy(b -> b.maxAttempts(...));</pre>  | 
| Verwenden Sie gedrosselte Wiederholungen |  <pre>clientConfig.setUseThrottleRetries(...)<br />clientConfig.withUseThrottleRetries(...)</pre>  | [Wird nicht unterstützt](https://github.com/aws/aws-sdk-java-v2/issues/645) | 
| Max. Anzahl aufeinanderfolgender Wiederholungen vor der Drosselung |  <pre>clientConfig.setMaxConsecutiveRetriesBeforeThrottling(...)<br />clientConfig.withMaxConsecutiveRetriesBeforeThrottling(...)</pre>  | [Wird nicht unterstützt](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>  | 

## Asynchrone Clients
<a name="client-async-config-diffs"></a>


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

## Andere Änderungen beim Kunden
<a name="client-config-other-diffs"></a>

Die folgende `ClientConfiguration` Option von 1.x wurde in 2.x des SDK geändert und hat kein direktes Äquivalent.


| Einstellung | 1.x | 2.x-Äquivalent | 
| --- | --- | --- | 
| Protocol (Protokoll) |  <pre>clientConfig.setProtocol(Protocol.HTTP)<br />clientConfig.withProtocol(Protocol.HTTP)</pre>  |  Die Protokolleinstellung ist standardmäßig HTTPS. Um die Einstellung zu ändern, geben Sie das Protokoll an, das einen HTTP-Endpunkt auf dem Client Builder festlegt: <pre>clientBuilder.endpointOverride(<br />    URI.create("http://..."))</pre>  | 

# Änderungen des Anbieters für Anmeldeinformationen
<a name="migration-client-credentials"></a>

Dieser Abschnitt enthält eine Übersicht der Namensänderungen der Klassen und Methoden von Anmeldedatenanbietern zwischen den Versionen 1.x und 2.x von. AWS SDK für Java

## Bemerkenswerte Unterschiede
<a name="client-credentials"></a>
+ Der Standard-Anmeldeinformationsanbieter lädt in Version 2.x Systemeigenschaften vor Umgebungsvariablen. Weitere Informationen finden Sie unter [Anmeldeinformationen verwenden](credentials.md).
+ Die Konstruktormethode wurde durch die `create`- oder `builder`-Methoden ersetzt.  
**Example**  

  ```
  DefaultCredentialsProvider.create();
  ```
+ Asynchrone Aktualisierung wird nicht mehr standardmäßig festgelegt. Sie müssen sie mit dem `builder` des Anmeldeinformationsanbieters angeben.  
**Example**  

  ```
  ContainerCredentialsProvider provider = ContainerCredentialsProvider.builder()
          		.asyncCredentialUpdateEnabled(true)
          		.build();
  ```
+ Sie können mit dem `ProfileCredentialsProvider.builder()` einen Pfad zu einer benutzerdefinierten Profildatei angeben.  
**Example**  

  ```
  ProfileCredentialsProvider profile = ProfileCredentialsProvider.builder()
          		.profileFile(ProfileFile.builder().content(Paths.get("myProfileFile.file")).build())
          		.build();
  ```
+ Das Profildateiformat wurde geändert, um eine größere Übereinstimmung mit der AWS CLI zu erreichen. Einzelheiten finden Sie unter [Konfiguration von AWS CLI im AWS Command Line Interface](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html) *Benutzerhandbuch*.

## Die Änderungen des Anmeldeinformationsanbieters wurden zwischen den Versionen 1.x und 2.x zugeordnet
<a name="credentials-changes-mapping"></a>

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


| Kategorie ändern | 1.x | 2.x | 
| --- | --- | --- | 
| Name des Pakets/der Klasse | com.amazonaws.auth.AWSCredentialsProvider | software.amazon.awssdk.auth.credentials.AwsCredentialsProvider | 
| Name der Methode | getCredentials | resolveCredentials | 
| Methode wird nicht unterstützt | refresh | Nicht unterstützt | 

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


| Kategorie ändern | 1.x | 2.x | 
| --- | --- | --- | 
| Name des Pakets/der Klasse | com.amazonaws.auth.DefaultAWSCredentialsProviderChain | software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider | 
| Erstellung | new DefaultAWSCredentialsProviderChain | DefaultCredentialsProvider.create | 
| Methode wird nicht unterstützt | getInstance | Nicht unterstützt | 
| Prioritätsreihenfolge der externen Einstellungen |  Umgebungsvariablen vor Systemeigenschaften  |  Systemeigenschaften vor Umgebungsvariablen  | 

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


| Kategorie ändern | 1.x | 2.x | 
| --- | --- | --- | 
| Name des Pakets/der Klasse | com.amazonaws.auth.AWSStaticCredentialsProvider | software.amazon.awssdk.auth.credentials.StaticCredentialsProvider | 
| Erstellung | new AWSStaticCredentialsProvider | StaticCredentialsProvider.create | 

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


| Kategorie ändern | 1.x | 2.x | 
| --- | --- | --- | 
| Name des Pakets/der Klasse | com.amazonaws.auth.EnvironmentVariableCredentialsProvider | software.amazon.awssdk.auth.credentials.EnvironmentVariableCredentialsProvider | 
| Erstellung | new EnvironmentVariableCredentialsProvider | EnvironmentVariableCredentialsProvider.create | 
| Name der Umgebungsvariablen | AWS\$1ACCESS\$1KEY | AWS\$1ACCESS\$1KEY\$1ID | 
|  | AWS\$1SECRET\$1KEY | AWS\$1SECRET\$1ACCESS\$1KEY | 

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


| Kategorie ändern | 1.x | 2.x | 
| --- | --- | --- | 
| Name des Pakets/der Klasse | com.amazonaws.auth.SystemPropertiesCredentialsProvider | software.amazon.awssdk.auth.credentials.SystemPropertyCredentialsProvider | 
| Erstellung | new SystemPropertiesCredentialsProvider | SystemPropertiesCredentialsProvider.create | 
| Name der Systemeigenschaft | aws.secretKey | aws.secretAccessKey | 

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


| Kategorie ändern | 1.x | 2.x | 
| --- | --- | --- | 
| Name des Pakets/der Klasse | com.amazonaws.auth.profile.ProfileCredentialsProvider | software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider | 
| Erstellung | new ProfileCredentialsProvider | ProfileCredentialsProvider.create | 
| Speicherort des benutzerdefinierten Profils |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/de_de/sdk-for-java/latest/developer-guide/migration-client-credentials.html)  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/de_de/sdk-for-java/latest/developer-guide/migration-client-credentials.html)  | 

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


| Kategorie ändern | 1.x | 2.x | 
| --- | --- | --- | 
| Name des Pakets/der Klasse | com.amazonaws.auth.ContainerCredentialsProvider | software.amazon.awssdk.auth.credentials.ContainerCredentialsProvider | 
| Erstellung | new ContainerCredentialsProvider | ContainerCredentialsProvider.create | 
| Geben Sie die asynchrone Aktualisierung an | Nicht unterstützt | Standardverhalten | 

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


| Kategorie ändern | 1.x | 2.x | 
| --- | --- | --- | 
| Name des Pakets/der Klasse | com.amazonaws.auth.InstanceProfileCredentialsProvider | software.amazon.awssdk.auth.credentials.InstanceProfileCredentialsProvider | 
| Erstellung | new InstanceProfileCredentialsProvider | InstanceProfileCredentialsProvider.create | 
| Geben Sie die asynchrone Aktualisierung an | new InstanceProfileCredentialsProvider(true) |  `InstanceProfileCredentialProvider.builder().asyncCredentialUpdateEnabled(true).build()`  | 
| Name der Systemeigenschaft | com.amazonaws.sdk.disableEc2Metadata | aws.disableEc2Metadata | 
|  | com.amazonaws.sdk.ec2MetadataServiceEndpointOverride | aws.ec2MetadataServiceEndpoint | 

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


| Kategorie ändern | 1.x | 2.x | 
| --- | --- | --- | 
| Name des Pakets/der Klasse | com.amazonaws.auth.STSAssumeRoleSessionCredentialsProvider | software.amazon.awssdk.services.sts.auth.StsAssumeRoleCredentialsProvider | 
| Erstellung |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/de_de/sdk-for-java/latest/developer-guide/migration-client-credentials.html)  | StsAssumeRoleCredentialsProvider.builder | 
| Asynchrone Aktualisierung | Standardverhalten | Standardverhalten | 
| Konfiguration | new STSAssumeRoleSessionCredentialsProvider.Builder | Konfigurieren Sie eine StsClient und AssumeRoleRequest fordern Sie an | 

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


| Kategorie ändern | 1.x | 2.x | 
| --- | --- | --- | 
| Name des Pakets/der Klasse | com.amazonaws.auth.STSSessionCredentialsProvider | software.amazon.awssdk.services.sts.auth.StsGetSessionTokenCredentialsProvider | 
| Erstellung |  `new STSSessionCredentialsProvider`  | StsGetSessionTokenCredentialsProvider.builder | 
| Asynchrone Aktualisierung | Standardverhalten | StsGetSessionTokenCredentialsProvider.builder | 
| Konfiguration | Konstruktor-Parameter | Konfigurieren Sie eine StsClient GetSessionTokenRequest UND-Anfrage in einem Builder | 

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


| Kategorie ändern | 1.x | 2.x | 
| --- | --- | --- | 
| Name des Pakets/der Klasse | com.amazonaws.auth.WebIdentityFederationSessionCredentialsProvider | software.amazon.awssdk.services.sts.auth.StsAssumeRoleWithWebIdentityCredentialsProvider | 
| Erstellung |  `new WebIdentityFederationSessionCredentialsProvider`  | StsAssumeRoleWithWebIdentityCredentialsProvider.builder | 
| Asynchrone Aktualisierung | Standardverhalten | StsAssumeRoleWithWebIdentityCredentialsProvider.builder | 
| Konfiguration | Konstruktor-Parameter | Konfigurieren Sie eine StsClient AssumeRoleWithWebIdentityRequest UND-Anfrage in einem Builder | 

### Klassen wurden ersetzt
<a name="credentials-provider-changes-Replacements"></a>


| Klasse 1.x | 2.x Ersatzklassen | 
| --- | --- | 
| com.amazonaws.auth.EC2ContainerCredentialsProviderWrapper | software.amazon.awssdk.auth.credentials.ContainerCredentialsProvider und software.amazon.awssdk.auth.credentials.InstanceProfileCredentialsProvider | 
| com.amazonaws.services.s3.S3CredentialsProviderChain | software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider und software.amazon.awssdk.auth.credentials.AnonymousCredentialsProvider | 

### Klassen wurden entfernt
<a name="credentials-provider-changes-Removed"></a>


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

# Änderungen in der Region
<a name="migration-client-region"></a>

In diesem Abschnitt werden die in Version AWS SDK für Java 2.x implementierten Änderungen für die Verwendung der Klassen und beschrieben. `Region` `Regions`

## Konfiguration der Region
<a name="region-configuration"></a>
+ Einige AWS Dienste haben keine regionsspezifischen Endpunkte. Bei Verwendung dieser Services müssen Sie die Region als `Region.AWS_GLOBAL` oder `Region.AWS_CN_GLOBAL` festlegen.  
**Example**  

  ```
  Region region = Region.AWS_GLOBAL;
  ```
+  Die Klassen `com.amazonaws.regions.Regions` und `com.amazonaws.regions.Region` wurden nun in eine Klasse `software.amazon.awssdk.regions.Region` kombiniert.

## Zuordnungen von Methoden und Klassennamen
<a name="region-method-mapping"></a>

In den folgenden Tabellen werden regionsbezogene Klassen zwischen den Versionen 1.x und 2.x von zugeordnet. AWS SDK für Java Sie können eine Instance dieser Klassen mit der `of()`-Methode erstellen.

**Example**  

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


**Änderungen an der Klassenmethode 1.x Regions**  

| 1.x | 2.x | 
| --- | --- | 
|  `Regions.fromName`  |  `Region.of`  | 
|  `Regions.getName`  |  `Region.id`  | 
|  `Regions.getDescription`  |  `Region.metadata().description()`  | 
|  `Regions.getCurrentRegion`  |  Nicht unterstützt  | 
|  `Regions.DEFAULT_REGION`  |  Nicht unterstützt  | 
|  `Regions.name`  |  `Region.id`  | 


**1.x Änderungen an der Methode der Regionsklasse**  

| 1.x | 2.x | 
| --- | --- | 
|  `Region.getName`  |  `Region.id`  | 
|  `Region.hasHttpsEndpoint`  |  Nicht unterstützt  | 
|  `Region.hasHttpEndpoint`  |  Nicht unterstützt  | 
|  `Region.getAvailableEndpoints`  |  Nicht unterstützt  | 
|  `Region.createClient`  |  Nicht unterstützt  | 


**RegionMetadata Änderungen an der Klassenmethode**  

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


**ServiceMetadata Änderungen der Klassenmethode**  

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

# Änderungen von Vorgängen, Anfragen und Antworten
<a name="migration-operation-requests-responses"></a>

In Version 2 des SDK for Java werden Anfragen an einen Client-Vorgang übergeben. Zum Beispiel `DynamoDbClient's` `PutItemRequest` wird an den `DynamoDbClient.putItem` Vorgang übergeben. Diese Operationen geben eine Antwort von der zurück AWS-Service, wie z. B. `PutItemResponse` a.

Version 2 des SDK for Java weist die folgenden Änderungen gegenüber Version 1 auf.
+ Operationen mit mehreren Antwortseiten verfügen jetzt über eine `Paginator` Methode zur automatischen Iteration aller Elemente in der Antwort.
+ Anfragen und Antworten können nicht mutiert werden.
+ Sie müssen Anfragen und Antworten mit einer statischen Builder-Methode anstelle eines Konstruktors erstellen. Zum Beispiel `new PutItemRequest().withTableName(...)` ist Version 1 jetzt`PutItemRequest.builder().tableName(...).build()`.
+ Operations unterstützt eine kurze Methode zum Erstellen von Anfragen:`dynamoDbClient.putItem(request -> request.tableName(...))`.

In den folgenden Abschnitten werden spezifische Änderungen zwischen Version 1 und Version 2 beschrieben. Einige Änderungen des Parametertyps können mithilfe des [Migrationstools](migration-tool.md) automatisch konvertiert werden, während andere Änderungen manuelle Aktualisierungen Ihres Codes erfordern.

# Datumsparameteränderungen
<a name="migration-date-parameters"></a>

In Version 1 akzeptierten viele Operationen `java.util.Date` Objekte für zeitbasierte Parameter. In Version 2 verwenden diese Operationen stattdessen `java.time.Instant` Objekte.

Sie können `Date` Parameter automatisch mit dem [Migrationstool](migration-tool.md) konvertieren, oder Sie können sie manuell konvertieren, indem Sie die `toInstant()` Methode für Ihr `Date` Objekt aufrufen.

**Example - Generieren Sie eine vorsignierte URL mit einem Ablaufdatum in Version 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 - Generieren Sie in Version 2 eine vorsignierte URL mit einem Ablaufzeitpunkt**  

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

# Änderungen beim Umgang mit Binärdaten
<a name="migration-binary-data"></a>

In Version 1 wurden Binärdaten direkt mithilfe von `ByteBuffer` Objekten verarbeitet. In Version 2 verwendet das SDK `SdkBytes` Objekte, die eine bequemere und typsicherere Art der Arbeit mit Binärdaten bieten.

Sie können sie mithilfe des [Migrationstools](migration-tool.md) in `SdkBytes` `ByteBuffer` automatisch konvertieren, oder Sie können sie manuell konvertieren, indem Sie das zurückgegebene `SdkBytes` Objekt aufrufen`asByteBuffer()`.

**Example - Ruft Binärdaten aus einem Nachrichtenattribut in Version 1 ab**  

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

**Example - Ruft Binärdaten aus einem Nachrichtenattribut in Version 2 ab**  

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

# Änderungen der Timeout-Parameter
<a name="migration-timeout-parameters"></a>

In Version 1 wurden Timeout-Werte als Ganzzahlwerte angegeben, die Millisekunden repräsentieren. In Version 2 verwenden Timeout-Parameter `java.time.Duration` Objekte, um die Typsicherheit und Übersichtlichkeit zu erhöhen.

Sie können numerische Timeout-Werte automatisch mit dem [Migrationstool](migration-tool.md) konvertieren, oder Sie können sie manuell konvertieren, indem Sie Ihre numerischen Werte mit der entsprechenden `Duration` Factory-Methode umschließen.

**Example - Legen Sie in Version 1 ein Zeitlimit für Anfragen fest**  

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

**Example - Legen Sie in Version 2 ein Anforderungs-Timeout fest**  

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

Sie können die folgenden `Duration` werkseitigen Methoden für Timeout-Werte verwenden:
+ `Duration.ofMillis(long millis)`- Für Millisekundenwerte.
+ `Duration.ofSeconds(long seconds)`- Für zweite Werte.
+ `Duration.ofMinutes(long minutes)`- Für Minutenwerte.

# Unterschiede beim Streaming-Betrieb zwischen 1.x und 2.x des AWS SDK für Java
<a name="migration-streaming-ops"></a>

Streaming-Operationen wie Amazon S3 `getObject` und `putObject` Methods unterstützen die Nichtblockierung I/O in Version 2.x des SDK. Infolgedessen verwenden die Objekte des Anforderungs- und Antwortmodells kein A mehr `InputStream` als Parameter. Stattdessen akzeptiert das Anforderungsobjekt bei synchronen Anfragen`RequestBody`, was ein Bytestrom ist. Das asynchrone Äquivalent akzeptiert eine. `AsyncRequestBody`

**Example des Amazon S3 `putObject` S3-Betriebs in 1.x**  

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

**Example des Amazon S3 `putObject` S3-Betriebs in 2.x**  

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

Ein Streaming-Antwortobjekt akzeptiert a `ResponseTransformer` für synchrone Clients und a `AsyncResponseTransformer` für asynchrone Clients in V2.

**Example des Amazon S3 `getObject` S3-Betriebs in 1.x**  

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

**Example des Amazon S3 `getObject` S3-Betriebs in 2.x**  

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

Im SDK for Java 2.x verfügen Streaming-Antwortoperationen über eine `AsBytes` Methode, um die Antwort in den Speicher zu laden und gängige Typkonvertierungen im Speicher zu vereinfachen.

# Serialisierungsunterschiede zwischen 1.x und 2.x des AWS SDK für Java
<a name="migration-serialization-changes"></a>

## Listet Objekte auf, um den Unterschied zwischen Parametern anzufordern
<a name="serialization-diffs-list-obj-to-req-param"></a>

Das SDK for Java v1.x und v2.x unterscheidet sich darin, wie sie List-Objekte serialisieren, um Parameter anzufordern.

Das SDK for Java 1.x serialisiert keine leere Liste, wohingegen das SDK for Java 2.x eine leere Liste als leeren Parameter serialisiert.

Stellen Sie sich zum Beispiel einen Dienst mit a vor, der eine benötigt. `SampleOperation` `SampleRequest` Der `SampleRequest` akzeptiert zwei Parameter — den Typ String `str1` und den Typ List `listParam` —, wie in den folgenden Beispielen gezeigt.

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

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

sampleServiceV1Client.sampleOperation(v1Request);
```
Die Protokollierung auf Wireebene zeigt, dass der `listParam` Parameter nicht serialisiert ist.  

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

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

```
sampleServiceV2Client.sampleOperation(b -> b
    .str1("TestName"));
```
Die Protokollierung auf Wireebene zeigt, dass der `listParam` Parameter ohne Wert serialisiert ist.  

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

## POJOs in V1 im Vergleich zu Buildern in V2
<a name="serialization-json-objects"></a>

[Da das V1-SDK SDK for Java veränderbare POJO-Klassen verwendet, können Serialisierungs- und Deserialisierungsbibliotheken — wie Jackson — Modellobjekte direkt verwenden.](https://github.com/FasterXML/jackson-docs) 

Das V2 SDK for Java verwendet dagegen unveränderliche Modellobjekte. Sie müssen einen Zwischengenerator verwenden, um die De/Serialisierung durchzuführen.

Das folgende Beispiel zeigt die Unterschiede zwischen de/serializing einem `headBucket` API-Aufruf mit V1 und V2 unter Verwendung eines 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();
    }
```

# Deserialisierungsunterschiede zwischen 1.x und 2.x des AWS SDK für Java
<a name="migration-deserialization-changes"></a>

## Leere Sammlungen in V2 im Vergleich zu `nulls` in V1
<a name="deserialization-diffs-list-obj-to-req-param"></a>

Das SDK for Java v1.x und v2.x unterscheidet sich darin, wie sie JSON-Antworten mit leeren Listen und Maps deserialisieren.

Wenn das SDK eine Antwort mit einer fehlenden Eigenschaft empfängt, die als Liste oder Map modelliert ist, deserialisiert V1 die fehlende Eigenschaft zu, wohingegen V2 die Eigenschaft zu einem unveränderlichen leeren `null` Sammlungsobjekt deserialisiert.

Betrachten Sie beispielsweise die Antwort, die von einem DynamoDB-Client für die `describeTable` Methode zurückgegeben wurde. Die folgende Beispielmethode enthält einen V2-DynamoDB-Client und einen V1-DynamoDB-Client, die beide die `describeTable` Methode für eine Tabelle ausführen, die keine globalen Sekundärindizes hat.

**Example der Deserialisierung einer Eigenschaft, die als Liste modelliert wurde und in der Antwort fehlt**  

```
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>");
    }
}
```
Im Folgenden wird die protokollierte Ausgabe gezeigt:  

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

Das Java SDK 2.x verfolgt einen idiomatischen Ansatz, indem es leere Listen deserialisiert und unveränderlichen leeren Sammlungen zuordnet, anstatt sie zurückzugeben`null`, was sichereren und präziseren Code fördert. Mit V2 können Sie mit der `has*` Methode überprüfen, ob ein Dienst ein als Liste oder Map modelliertes Attribut zurückgegeben hat, wie im vorherigen Beispiel gezeigt. `hasGlobalSecondaryIndexes`

Dieser Ansatz vermeidet die Notwendigkeit expliziter `null` Prüfungen und entspricht modernen bewährten Java-Methoden für den Umgang mit fehlenden oder leeren Datenstrukturen.

### Vollständiges Beispiel
<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));
    }
}
```

Die JSON-Antwort für die `describeTable` Methode vom V1- und V2-Client enthält kein `GlobalSecondaryIndexes` Attribut:

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

# Ausnahmeänderungen
<a name="migration-exception-changes"></a>

Die Namen der Ausnahmeklassen, ihre Strukturen und ihre Beziehungen haben sich geändert. `software.amazon.awssdk.core.exception.SdkException`ist die neue `Exception` Basisklasse, die alle anderen Ausnahmen erweitern.

In dieser Tabelle werden die Ausnahmeänderungen der Klassennamen zugewiesen.


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

Die folgende Tabelle zeigt die Methoden für Ausnahmeklassen zwischen Version 1.x und 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`   | 

# Servicespezifische Änderungen
<a name="migration-service-changes"></a>

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

SDK for Java 2.x deaktiviert standardmäßig den anonymen Zugriff. Daher müssen Sie den anonymen Zugriff mithilfe von aktivieren. `AnonymousCredentialsProvider`

### Der Name des Vorgangs ändert sich
<a name="s3-op-name-changes"></a>

Viele der Operationsnamen für den Amazon S3 Client haben sich in der Version AWS SDK für Java 2.x geändert. In Version 1.x wird der Amazon S3 Client nicht direkt aus der Service-API generiert. Dies führt zu Inkonsistenzen zwischen den SDK-Operationen und der Service-API. In Version 2.x generieren wir den Amazon S3 Client jetzt so, dass er konsistenter mit der Service-API ist.

Die folgende Tabelle zeigt die Operationsnamen in den beiden Versionen.


**Namen Amazon S3 S3-Vorgängen**  

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

## Änderungen bei Amazon SNS
<a name="sns-changes"></a>

Ein SNS-Client kann nicht mehr auf SNS-Themen in anderen Regionen als der Region zugreifen, für die er konfiguriert ist.

## Änderungen an Amazon SQS
<a name="sqs-changes"></a>

Ein SQS-Client kann nicht mehr auf SQS-Warteschlangen in anderen Regionen als der Region zugreifen, für die er konfiguriert ist.

## Änderungen bei Amazon RDS
<a name="rds-changes"></a>

Das SDK for Java 2.x verwendet `RdsUtilities#generateAuthenticationToken` anstelle der Klasse `RdsIamAuthTokenGenerator` in 1.x.

# Änderungen bei der Arbeit mit Amazon S3 von Version 1 zu Version 2 von AWS SDK für Java
<a name="migration-s3"></a>

Das AWS SDK for Java 2.x führt zu erheblichen Änderungen am S3-Client, darunter eine neue Paketstruktur, aktualisierte Klassennamen und überarbeitete Methodensignaturen. Während viele Methoden mithilfe des [Migrationstools](migration-tool.md) automatisch von V1 auf V2 migriert werden können, erfordern einige eine manuelle Migration, wie `listNextBatchOfObjects` und`selectObjectContent`. Darüber hinaus ersetzt V2 bestimmte V1-Klassen wie `AccessControlList` und `CannedAccessControlList` durch neue Implementierungen.

**Topics**
+ [S3-Client-Unterschiede zwischen Version 1 und Version 2 von AWS SDK für Java](migration-s3-client.md)
+ [Migrieren Sie den Transfer Manager von Version 1 auf Version 2 von AWS SDK für Java](migration-s3-transfer-manager.md)
+ [Änderungen beim Parsen von Amazon S3 URIs von Version 1 zu Version 2](migration-s3-uri-parser.md)
+ [Änderungen in der S3-API für Ereignisbenachrichtigungen von Version 1 zu Version 2](migration-s3-event-notification.md)

# S3-Client-Unterschiede zwischen Version 1 und Version 2 von AWS SDK für Java
<a name="migration-s3-client"></a>

In diesem Thema werden die Unterschiede zwischen den S3-Clients in Version 1 und Version 2 des SDK for Java danach geordnet, wie das [Migrationstool](migration-tool.md) die Migration automatisieren kann. Das Tool unterstützt die Migration der meisten Methoden von V1 zu V2, einige Methoden erfordern jedoch eine manuelle Migration. Zusätzlich zu den S3-Client-Methoden verfügen einige S3-V1-Klassen nicht über ein direktes V2-Äquivalent, sodass Sie sie manuell migrieren müssen.

**Contents**
+ [Beispiele für V1-Methoden, die vom Migrationstool unterstützt werden](#methods-tool-migration)
  + [`putObject`](#V1-V2-putobject)
  + [`getObject`](#V1-V2-getobject)
+ [V1-Methoden, die eine manuelle Migration erfordern](#s3-methods-manual-migration)
  + [`getObject` mit `S3ObjectId`](#V1s-getObject-using-V1s-S3ObjectId)
  + [`getETag` mit `ObjectMetadata`](#V1s-ObjectMetadata-using-V1s-getETag)
  + [`listNextBatchOfObjects`](#V1-listNextBatchOfObjects)
  + [`listNextBatchOfVersions`](#V1-listNextBatchOfVersions)
  + [`selectObjectContent`](#V1-selectObjectContent)
  + [`setBucketAcl`](#V1-setBucketAcl)
  + [`setObjectAcl`](#V1-setObjectAcl)
  + [`initiateMultipartUpload`](#V1-initiateMultipartUpload)
    + [Beispiel für eine Migration](#V1-initiateMultipartUpload-migration-ex)
    + [Unterschiede bei der Implementierung](#V1-initiateMultipartUpload-impl-diffs)
  + [`setRegion`](#V1-setRegion)
  + [`setS3ClientOptions(S3ClientOptions clientOptions)`](#V1-setS3ClientOptions)
  + [`setBucketLoggingConfiguration`](#V1-setBucketLoggingConfiguration)
  + [`setBucketLifecycleConfiguration`](#V1-setBucketLifecycleConfiguration)
  + [`setBucketTaggingConfiguration`](#V1-setBucketTaggingConfiguration)
+ [V1-Klassen, die eine manuelle Migration erfordern](#s3-classes-manual-migration)
  + [`AccessControlList`](#V1-AccessControlList)
  + [`CannedAccessControlList`](#V1-CannedAccessControlList)
  + [`BucketNotificationConfiguration`](#V1-BucketNotificationConfiguration)
  + [`MultiFactorAuthentication`](#V1-MultifactorAuthentication)

## Beispiele für V1-Methoden, die vom Migrationstool unterstützt werden
<a name="methods-tool-migration"></a>

Das Migrationstool migriert die meisten Methoden automatisch von V1 auf V2. Die `getObject` Methoden `putObject` und sind zwei Beispiele.

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

## V1-Methoden, die eine manuelle Migration erfordern
<a name="s3-methods-manual-migration"></a>

Sie müssen die folgenden V1 S3-Client-Methoden manuell migrieren. Wenn Sie das Migrationstool verwenden, wird in der V2-Ausgabe-Java-Datei ein Kommentar angezeigt, der Sie zu diesem Thema weiterleitet.

### V1 `getObject` verwendet V1 `S3ObjectId` bis 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()` verwendet V1 `ObjectMetadata` bis 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());
```

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

### Von V1 `listNextBatchOfVersions` bis 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.
```

### Die `acl` Methode von V1 `setBucketAcl` bis V2 ist aktiviert `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);
```

### Die `acl` Methode von V1 `setObjectAcl` bis V2 ist aktiviert `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);
```

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

#### Beispiel für eine Migration
<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();
```

#### Unterschiede bei der Implementierung
<a name="V1-initiateMultipartUpload-impl-diffs"></a>

Der `Content-Type` Standard-Header-Wert für die folgenden Methoden unterscheidet sich wie in der folgenden Tabelle dargestellt.


****  

| SDK-Version | Methode | Der `Content-Type` Standardwert | 
| --- | --- | --- | 
| Version 1 | [initiateMultipartUpload](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/AmazonS3Client.html#initiateMultipartUpload-com.amazonaws.services.s3.model.InitiateMultipartUploadRequest-) | application/octet-stream | 
| Version 2 | [createMultipartUpload](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/s3/S3AsyncClient.html#createMultipartUpload(software.amazon.awssdk.services.s3.model.CreateMultipartUploadRequest)) | binary/octet-stream | 

### Von der Methode von `setRegion` V1 `region` zur Methode V2 im Client Builder
<a name="V1-setRegion"></a>

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


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

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

Anstatt ein einzelnes `S3ClientOptions` Objekt mit der `setS3ClientOptions` Methode zu verwenden, stellt V2 Methoden im Client Builder bereit, um Optionen festzulegen.

### Von V1 `setBucketLoggingConfiguration` bis 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);
```

### Von V1 `setBucketLifecycleConfiguration` bis 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);
```

### Von V1 `setBucketTaggingConfiguration` bis 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);
```

## V1-Klassen, die eine manuelle Migration erfordern
<a name="s3-classes-manual-migration"></a>

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

### Die `CannedAccessControlList` Enumeration von V1 zu V2 `BucketCannedACL` und die Aufzählungen `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));
```

### Von V1 `BucketNotificationConfiguration` bis 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));
```

### Von V1 `MultiFactorAuthentication` zur `mfa` Methode von V2 in einem Request Builder
<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);
```

# Migrieren Sie den Transfer Manager von Version 1 auf Version 2 von AWS SDK für Java
<a name="migration-s3-transfer-manager"></a>

Dieser Migrationsleitfaden behandelt die wichtigsten Unterschiede zwischen Transfer Manager v1 und S3 Transfer Manager v2, einschließlich Konstruktoränderungen, Methodenzuordnungen und Codebeispiele für allgemeine Operationen. Nachdem Sie diese Unterschiede überprüft haben, können Sie Ihren vorhandenen Transfer Manager-Code erfolgreich migrieren, um von der verbesserten Leistung und den asynchronen Vorgängen in Version 2 zu profitieren.

**Über das AWS SDK-Migrationstool**  
Das AWS SDK für Java bietet ein automatisiertes [Migrationstool](migration-tool.md), mit dem ein Großteil der v1 Transfer Manager-API auf Version 2 migriert werden kann. Das Migrationstool unterstützt jedoch nicht mehrere v1-Transfer-Manager-Funktionen. In diesen Fällen müssen Sie den Transfer Manager-Code anhand der Anleitung in diesem Thema manuell migrieren.  
In diesem Handbuch wird im **Migrationsstatus angegeben**, ob das Migrationstool einen Konstruktor, eine Methode oder ein Feature automatisch migrieren kann:  
**Unterstützt**: Das Migrationstool kann diesen Code automatisch transformieren
**Nicht unterstützt**: Sie müssen den Code manuell migrieren
Überprüfen Sie auch bei Elementen, die als „Unterstützt“ gekennzeichnet sind, die Migrationsergebnisse und testen Sie sie gründlich. Die Transfer Manager-Migration beinhaltet erhebliche architektonische Änderungen von synchronen zu asynchronen Vorgängen.

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

S3 Transfer Manager v2 führt wichtige Änderungen an der Transfer Manager-API ein. S3 Transfer Manager v2 basiert auf asynchronen Vorgängen und bietet eine bessere Leistung, insbesondere wenn Sie den AWS CRT-basierten Amazon S3 S3-Client verwenden.

### Die wichtigsten Unterschiede:
<a name="s3-tm-migration-key-differences"></a>
+ **Package**: `com.amazonaws.services.s3.transfer` → `software.amazon.awssdk.transfer.s3`
+ **Klassenname**: `TransferManager` → `S3TransferManager`
+ **Kundenabhängigkeit**: Synchroner Amazon S3 S3-Client → Asynchroner Amazon S3 S3-Client () `S3AsyncClient`
+ **Architektur**: Synchrone Operationen → Asynchrone Operationen mit `CompletableFuture`
+ **Leistung**: Verbessert durch AWS CRT-basierte Client-Unterstützung

## Änderungen auf hoher Ebene
<a name="s3-tm-migration-high-level-changes"></a>


| Aspekt | V1 | V2 | 
| --- | --- | --- | 
| Abhängigkeit von Maven | aws-java-sdk-s3 | s3-transfer-manager | 
| Package | com.amazonaws.services.s3.transfer | software.amazon.awssdk.transfer.s3 | 
| Hauptklasse | TransferManager | S3TransferManager | 
| Amazon S3 S3-Klient | AmazonS3(synchronisieren) | S3AsyncClient(asynchron) | 
| Rückgabetypen | Operationen blockieren | CompletableFuture<T> | 

## Maven-Abhängigkeiten
<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 [Letzte Version](https://central.sonatype.com/artifact/com.amazonaws/aws-java-sdk-bom). 2 [Letzte Version](https://central.sonatype.com/artifact/software.amazon.awssdk/bom). 3 [Letzte Version](https://central.sonatype.com/artifact/software.amazon.awssdk.crt/aws-crt).

## Migration des Client-Konstruktors
<a name="s3-tm-migration-client-constructor"></a>

### Unterstützte Konstruktoren (automatische Migration)
<a name="s3-tm-migration-supported-constructors"></a>


| V1-Konstruktor | V2-Äquivalent | Migrationsstatus | 
| --- | --- | --- | 
| new TransferManager() | S3TransferManager.create() | Unterstützt | 
| TransferManagerBuilder. defaultTransferManager() | S3TransferManager.create() | Unterstützt | 
| TransferManagerBuilder. standard().build() | S3TransferManager.builder().build() | Unterstützt | 
| new TransferManager(AWSCredentials) | S3TransferManager.builder() .s3Client(S3AsyncClient.builder() .credentialsProvider(...).build()) .build() | Unterstützt | 
| new TransferManager( AWSCredentialsProvider) | S3TransferManager.builder() .s3Client(S3AsyncClient.builder() .credentialsProvider(...).build()) .build() | Unterstützt | 

### Konstruktoren werden nicht unterstützt (manuelle Migration erforderlich)
<a name="s3-tm-migration-unsupported-constructors"></a>


| V1-Konstruktor | V2-Äquivalent | Hinweise zur Migration | 
| --- | --- | --- | 
| new TransferManager(AmazonS3) | Manuelle Migration erforderlich | Erstellen Sie ein S3AsyncClient separates | 
| new TransferManager(AmazonS3, ExecutorService) | Manuelle Migration erforderlich | Erstellen Sie einen S3AsyncClient Executor und konfigurieren Sie ihn | 
| new TransferManager(AmazonS3, ExecutorService, boolean) | Manuelle Migration erforderlich | shutDownThreadPoolsParameter wird nicht unterstützt | 

### Beispiele für manuelle Migrationen
<a name="s3-tm-migration-manual-examples"></a>

**V1-Code:**

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

**V2-Kode:**

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

## Migration der Client-Methode
<a name="s3-tm-migration-client-methods"></a>

Derzeit unterstützt das Migrationstool grundlegende `copy``download`,`upload`,`uploadDirectory`,`downloadDirectory`,`resumeDownload`, und `resumeUpload` Methoden.

### Wichtigste Übertragungsmethoden
<a name="s3-tm-migration-core-transfer-methods"></a>


| V1-Methode | V2-Methode | Änderung des Rückgabetyps | Migrationsstatus | 
| --- | --- | --- | --- | 
| upload(String, String, File) | uploadFile(UploadFileRequest) | Upload → FileUpload | Unterstützt | 
| upload(PutObjectRequest) | upload(UploadRequest) | Upload → Upload | Unterstützt | 
| download(String, String, File) | downloadFile(DownloadFileRequest) | Download → FileDownload | Unterstützt | 
| download(GetObjectRequest, File) | downloadFile(DownloadFileRequest) | Download → FileDownload | Unterstützt | 
| copy(String, String, String, String) | copy(CopyRequest) | Copy → Copy | Unterstützt | 
| copy(CopyObjectRequest) | copy(CopyRequest) | Copy → Copy | Unterstützt | 
| uploadDirectory(String, String, File, boolean) | uploadDirectory( UploadDirectoryRequest) | MultipleFileUpload → DirectoryUpload | Unterstützt | 
| downloadDirectory(String, String, File) | downloadDirectory( DownloadDirectoryRequest) | MultipleFileDownload → DirectoryDownload | Unterstützt | 

### Wiederaufnehmbare Übertragungsmethoden
<a name="s3-tm-migration-resumable-methods"></a>


| V1-Methode | V2-Methode | Migrationsstatus | 
| --- | --- | --- | 
| resumeUpload(PersistableUpload) | resumeUploadFile(ResumableFileUpload) | Unterstützt | 
| resumeDownload(PersistableDownload) | resumeDownloadFile(ResumableFileDownload) | Unterstützt | 

### Lebenszyklus-Methoden
<a name="s3-tm-migration-lifecycle-methods"></a>


| V1-Methode | V2-Methode | Migrationsstatus | 
| --- | --- | --- | 
| shutdownNow() | close() | Unterstützt | 
| shutdownNow(boolean) | Passen Sie den Code mithilfe der close() Methode manuell an | Nicht unterstützt | 

### Nicht unterstützte V1-Client-Methoden
<a name="s3-tm-migration-unsupported-methods"></a>


| V1-Methode | V2-Alternative | Hinweise | 
| --- | --- | --- | 
| abortMultipartUploads(String, Date) | Verwenden Sie den Amazon S3 S3-Client auf niedriger Ebene | Nicht unterstützt | 
| getAmazonS3Client() | Speichern Sie eine Referenz separat | Nicht unterstützt; kein Getter in Version 2 | 
| getConfiguration() | Speichern Sie eine Referenz separat | Nicht unterstützt; kein Getter in Version 2 | 
| uploadFileList(...) | Tätigen Sie mehrere Anrufe uploadFile() | Nicht unterstützt | 
| copyMethoden mit einem TransferStateChangeListener Parameter | Verwenden von TransferListener | [Siehe Beispiel für eine manuelle Migration](#tm-unsupported-client-methods-copy) | 
| downloadMethoden mit einem S3ProgressListener Parameter | Verwenden von [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) | [Siehe Beispiel für eine manuelle Migration](#tm-unsupported-client-methods-download) | 
|  `downloadDirectory`Methoden mit 4 oder mehr Parametern  |  | [Siehe Beispiel für eine manuelle Migration](#tm-unsupported-client-methods-download-dir) | 
| uploadMethode mit einem ObjectMetadataProvider Parameter | Legen Sie Metadaten in der Anfrage fest | [Siehe Beispiel für eine manuelle Migration](#tm-unsupported-client-methods-upload) | 
| uploadDirectoryMethoden mit \$1Provider Parametern | Legen Sie Tags auf Anfrage fest | [Siehe Beispiel für eine manuelle Migration](#tm-unsupported-client-methods-uploadDirectory) | 

#### `copy`Methoden mit einem `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`Methoden mit einem `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`Methoden mit 4 oder mehr Parametern
<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`Methode mit `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`mit `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);
```

## Migration von Modellobjekten
<a name="s3-tm-migration-model-objects"></a>

In AWS SDK for Java 2.x wurden viele `TransferManager` Modellobjekte neu gestaltet, und mehrere Getter- und Setter-Methoden, die in den Modellobjekten von Version 1 verfügbar sind, werden nicht mehr unterstützt. 

In Version 2 können Sie die `CompletableFuture<T>` Klasse verwenden, um Aktionen auszuführen, wenn die Übertragung abgeschlossen wurde — entweder erfolgreich oder mit einer Ausnahme. Sie können die `join()` Methode verwenden, um bei Bedarf auf den Abschluss zu warten. 

### Kernübertragungsobjekte
<a name="s3-tm-migration-core-transfer-objects"></a>


| Klasse V1 | Klasse V2 | Migrationsstatus | 
| --- | --- | --- | 
| TransferManager | S3TransferManager | Unterstützt | 
| TransferManagerBuilder | S3TransferManager.Builder | Unterstützt | 
| Transfer | Transfer | Unterstützt | 
| AbortableTransfer | Transfer | Unterstützt (keine separate Klasse) | 
| Copy | Copy | Unterstützt | 
| Download | FileDownload | Unterstützt | 
| Upload | Upload / FileUpload | Unterstützt | 
| MultipleFileDownload | DirectoryDownload | Unterstützt | 
| MultipleFileUpload | DirectoryUpload | Unterstützt | 

### Persistenz-Objekte
<a name="s3-tm-migration-persistence-objects"></a>


| Klasse V1 | Klasse V2 | Migrationsstatus | 
| --- | --- | --- | 
| PersistableDownload | ResumableFileDownload | Unterstützt | 
| PersistableUpload | ResumableFileUpload | Unterstützt | 
| PersistableTransfer | ResumableTransfer | Unterstützt | 
| PauseResult<T> | Direkt wiederaufnehmbares Objekt | Nicht unterstützt | 

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


| Klasse V1 | Klasse V2 | Migrationsstatus | 
| --- | --- | --- | 
| CopyResult | CompletedCopy | Unterstützt | 
| UploadResult | CompletedUpload | Unterstützt | 

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


| Klasse V1 | Klasse V2 | Migrationsstatus | 
| --- | --- | --- | 
| TransferManagerConfiguration | MultipartConfiguration(auf dem Amazon S3 S3-Client) | Unterstützt | 
| TransferProgress | TransferProgress \$1 TransferProgressSnapshot | Unterstützt | 
| KeyFilter | DownloadFilter | Unterstützt | 

### Nicht unterstützte Objekte
<a name="s3-tm-migration-unsupported-objects"></a>


| Klasse V1 | Alternative V2 | Migrationsstatus | 
| --- | --- | --- | 
| PauseStatus | Nicht unterstützt | Nicht unterstützt | 
| UploadContext | Nicht unterstützt | Nicht unterstützt | 
| ObjectCannedAclProvider | PutObjectRequest.builder().acl() | Nicht unterstützt | 
| ObjectMetadataProvider | PutObjectRequest.builder().metadata() | Nicht unterstützt | 
| ObjectTaggingProvider | PutObjectRequest.builder().tagging() | Nicht unterstützt | 
| PresignedUrlDownload | Nicht unterstützt | Nicht unterstützt | 

## TransferManagerBuilder Migration der Konfiguration
<a name="s3-tm-migration-builder-configuration"></a>

### Konfigurationsänderungen
<a name="migration-transfer-manager-config-changes"></a>

Die Konfigurationsänderungen, die Sie für den v2-Transfermanager vornehmen müssen, hängen davon ab, welchen S3-Client Sie verwenden. Sie haben die Wahl zwischen dem AWS CRT-basierten S3-Client oder dem standardmäßigen, auf Java basierenden asynchronen S3-Client. Informationen zu den Unterschieden finden Sie im Thema. [S3-Clients in der AWS SDK for Java 2.x](examples-s3.md#s3-clients)

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


****  

| Einstellung | v1 | v2 — Transfer Manager mit AWS CRT-basiertem S3-Client | 
| --- | --- | --- | 
|    (hol dir einen Builder)  |  <pre>TransferManagerBuilder tmBuilder = <br />   TransferManagerBuilder.standard();</pre>  |  <pre>S3TransferManager.Builder tmBuilder  = <br />  S3TransferManager.builder();</pre>  | 
|    S3-Klient  |  <pre>tmBuilder.withS3Client(...);<br />tmBuilder.setS3Client(...);</pre>  |  <pre>tmBuilder.s3Client(...);</pre>  | 
|    Testamentsvollstrecker  |  <pre>tmBuilder.withExecutorFactory(...);<br />tmBuilder.setExecutorFactory(...);</pre>  |  <pre>tmBuilder.executor(...);</pre>  | 
|    Threadpools herunterfahren  |  <pre>tmBuilder.withShutDownThreadPools(...);<br />tmBuilder.setShutdownThreadPools(...);</pre>  | Nicht unterstützt Der bereitgestellte Executor wird nicht heruntergefahren, wenn der S3TransferManager geschlossen wird | 
|    Minimale Größe des Upload-Teils  |  <pre>tmBuilder.withMinimumUploadPartSize(...);<br />tmBuilder.setMinimumUploadPartSize(...);</pre>  |  <pre>S3AsyncClient s3 = S3AsyncClient.crtBuilder().<br />      minimumPartSizeInBytes(...).build();<br /><br />tmBuilder.s3Client(s3);</pre>  | 
|    Schwellenwert für mehrteiliges Hochladen  |  <pre>tmBuilder.withMultipartUploadThreshold(...);<br />tmBuilder.setMultipartUploadThreshold(...);</pre>  |  <pre>S3AsyncClient s3 = S3AsyncClient.crtBuilder().<br />      thresholdInBytes(...).build();<br /><br />tmBuilder.s3Client(s3);</pre>  | 
|    Minimale Größe des Kopierteils  |  <pre>tmBuilder.withMultipartCopyPartSize(...);<br />tmBuilder.setMultipartCopyPartSize(...);</pre>  |  <pre>S3AsyncClient s3 = S3AsyncClient.crtBuilder().<br />      minimumPartSizeInBytes(...).build();<br /><br />tmBuilder.s3Client(s3);</pre>  | 
|    Schwellenwert für mehrteiliges Kopieren  |  <pre>tmBuilder.withMultipartCopyThreshold(...);<br />tmBuilder.setMultipartCopyThreshold(...);</pre>  |  <pre>S3AsyncClient s3 = S3AsyncClient.crtBuilder().<br />      thresholdInBytes(...).build();<br /><br />tmBuilder.s3Client(s3);</pre>  | 
|    parallel Downloads deaktivieren  |  <pre>tmBuilder.withDisableParallelDownloads(...);<br />tmBuilder.setDisableParallelDownloads(...);</pre>  | Deaktivieren Sie parallel Downloads, indem Sie einen standardmäßigen Java-basierten S3-Client mit deaktiviertem Multipart (Standard) an den Transfermanager übergeben.<pre>S3AsyncClient s3 =<br />   S3AsyncClient.builder().build();<br /><br />tmBuilder.s3Client(s3);</pre> | 
|    Berechne immer mehrteiliges MD5  |  <pre>tmBuilder.withAlwaysCalculateMultipartMd5(...);<br />tmBuilder.setAlwaysCalculateMultipartMd5(...);</pre>  | Nicht unterstützt | 

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


****  

| Einstellung | v1 | v2 — Transfer Manager mit einem Java-basierten asynchronen S3-Client | 
| --- | --- | --- | 
|    (hol dir einen Builder)  |  <pre>TransferManagerBuilder tmBuilder = <br />   TransferManagerBuilder.standard();</pre>  |  <pre>S3TransferManager.Builder tmBuilder  = <br />  S3TransferManager.builder();</pre>  | 
|    S3-Klient  |  <pre>tmBuilder.withS3Client(...);<br />tmBuilder.setS3Client(...);</pre>  |  <pre>tmBuilder.s3Client(...);</pre>  | 
|    Testamentsvollstrecker  |  <pre>tmBuilder.withExecutorFactory(...);<br />tmBuilder.setExecutorFactory(...);</pre>  |  <pre>tmBuilder.executor(...);</pre>  | 
|    Threadpools herunterfahren  |  <pre>tmBuilder.withShutDownThreadPools(...);<br />tmBuilder.setShutdownThreadPools(...);</pre>  | Nicht unterstützt Der bereitgestellte Executor wird nicht heruntergefahren, wenn der S3TransferManager geschlossen wird | 
|    Minimale Größe des Upload-Teils  |  <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>  | 
|    Schwellenwert für mehrteiliges Hochladen  |  <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>  | 
|    Minimale Größe des Kopierteils  |  <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>  | 
|    Schwellenwert für mehrteiliges Kopieren  |  <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>  | 
|    parallel Downloads deaktivieren  |  <pre>tmBuilder.withDisableParallelDownloads(...);<br />tmBuilder.setDisableParallelDownloads(...);</pre>  | Deaktivieren Sie parallel Downloads, indem Sie einen standardmäßigen Java-basierten S3-Client mit deaktiviertem Multipart (Standard) an den Transfermanager übergeben.<pre>S3AsyncClient s3 =<br />   S3AsyncClient.builder().build();<br /><br />tmBuilder.s3Client(s3);</pre> | 
|    Berechne immer mehrteiliges MD5  |  <pre>tmBuilder.withAlwaysCalculateMultipartMd5(...);<br />tmBuilder.setAlwaysCalculateMultipartMd5(...);</pre>  | Nicht unterstützt | 

------

## Verhaltensänderungen
<a name="s3-tm-migration-behavior-changes"></a>

### Asynchrone Operationen
<a name="s3-tm-migration-async-operations"></a>

**V1 (blockierend):**

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

**V2 (asynchron):**

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

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

**V1:** Verzeichnisübertragungen schlagen vollständig fehl, wenn eine Unteranforderung fehlschlägt.

**V2:** Verzeichnisübertragungen werden erfolgreich abgeschlossen, auch wenn einige Unteranfragen fehlschlagen. Explizit nach Fehlern suchen:

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

### Paralleler Download über Bytebereichs-Abrufe
<a name="migration-transfer-manager-behavior-fetches"></a>

Wenn die automatische parallele Übertragung im v2-SDK aktiviert ist, verwendet der S3 Transfer Manager [Bytebereichs-Abrufe, um bestimmte](https://docs.aws.amazon.com/AmazonS3/latest/userguide/optimizing-performance-guidelines.html#optimizing-performance-guidelines-get-range) Teile des Objekts parallel abzurufen (mehrteiliger Download). Die Art und Weise, wie ein Objekt mit Version 2 heruntergeladen wird, hängt nicht davon ab, wie das Objekt ursprünglich hochgeladen wurde. Alle Downloads können von hohem Durchsatz und Parallelität profitieren. 

Im Gegensatz dazu spielt es beim Transfer Manager von Version 1 eine Rolle, wie das Objekt ursprünglich hochgeladen wurde. Der v1-Transfermanager ruft die Teile des Objekts auf die gleiche Weise ab, wie die Teile hochgeladen wurden. Wenn ein Objekt ursprünglich als einzelnes Objekt hochgeladen wurde, ist der v1 Transfer Manager nicht in der Lage, den Download-Vorgang mithilfe von Unteranforderungen zu beschleunigen.

# Änderungen beim Parsen von Amazon S3 URIs von Version 1 zu Version 2
<a name="migration-s3-uri-parser"></a>

In diesem Thema werden die Änderungen beim Parsen von Amazon S3 URIs von Version 1 (v1) auf Version 2 (v2.) beschrieben.

## Änderungen auf hoher Ebene
<a name="migration-3-uri-parser-api-changes"></a>

Um mit dem Parsen eines S3-URI in Version 1 zu beginnen, instanziieren Sie einen `AmazonS3URI` mithilfe eines Konstruktors. In v2 rufen Sie eine Instanz von `parseUri()` auf`S3Utilities`, um eine zurückzugeben. `S3URI`


****  

| Änderungen | v1 |   v2 | 
| --- | --- | --- | 
|    Maven-Abhängigkeiten  |  <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>  | 
| Package name | com.amazonaws.services.s3 | software.amazon.awssdk.services.s3 | 
| Klassennamen | [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 [Letzte Version](https://central.sonatype.com/artifact/com.amazonaws/aws-java-sdk-bom). 2 [Letzte Version](https://central.sonatype.com/artifact/software.amazon.awssdk/bom).

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


| Behavior | v1 |   v2 | 
| --- | --- | --- | 
| Analysieren Sie eine S3-URI. |  <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>  | 
| Ruft den Bucket-Namen aus einer S3-URI ab. |  <pre>String bucket = s3Uri.getBucket();</pre>  |  <pre>Optional<String> bucket = s3Uri.bucket();</pre>  | 
| Rufen Sie den Schlüssel ab. |  <pre>String key = s3Uri.getKey();</pre>  |  <pre>Optional<String> key = s3Uri.key();</pre>  | 
| Rufen Sie die Region ab. |  <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>  | 
|  Ruft ab, ob die S3-URI im Pfadstil ist.  |  <pre>boolean isPathStyle = s3Uri.isPathStyle();</pre>  |  <pre>boolean isPathStyle = s3Uri.isPathStyle();</pre>  | 
| Rufen Sie die Versions-ID ab. |  <pre>String versionId = s3Uri.getVersionId();</pre>  |  <pre>Optional<String> versionId = <br />    s3Uri.firstMatchingRawQueryParameter("versionId");</pre>  | 
| Rufen Sie die Abfrageparameter ab. | – |  <pre>Map<String, List<String>> queryParams =<br />    s3Uri.rawQueryParameters();</pre>  | 

### Verhaltensänderungen
<a name="migration-s3-uri-parser-behavior-changes"></a>

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

v1 bietet die Möglichkeit, ein Flag zu übergeben, um anzugeben, ob der URI URL-codiert werden soll. Der Standardwert ist `true`. 

In Version 2 wird die URL-Kodierung nicht unterstützt. Wenn Sie mit Objektschlüsseln oder Abfrageparametern arbeiten, die reservierte oder unsichere Zeichen enthalten, müssen Sie diese URL-kodieren. Beispielsweise müssen Sie ein Leerzeichen `" "` durch ersetzen. `%20`

# Änderungen in der S3-API für Ereignisbenachrichtigungen von Version 1 zu Version 2
<a name="migration-s3-event-notification"></a>

In diesem Thema werden die Änderungen an der API für S3-Ereignisbenachrichtigungen von Version 1.x (v1) auf Version 2 .x (v2) von beschrieben. AWS SDK für Java

## Änderungen auf hoher Ebene
<a name="migration-s3-event-notification-hl"></a>

### Strukturelle Veränderungen
<a name="migration-s3-event-notification-hl-struct"></a>

V1 verwendet statische innere Klassen für `EventNotificationRecord` Typen und ihre Attribute, wohingegen v2 separate öffentliche Klassen für `EventNotificationRecord` Typen verwendet.

### Die Namenskonvention ändert sich
<a name="migration-s3-event-notification-hl-naming"></a>

In Version 1 enthalten Attributklassennamen das Suffix *Entity*, wohingegen in Version 2 dieses Suffix aus Gründen der einfacheren Benennung weggelassen wird: zum Beispiel *EventData* statt. *eventDataEntity*

## Änderungen an Abhängigkeiten, Paketen und Klassennamen
<a name="migration-s3-event-notification-deps"></a>

In Version 1 werden S3 Event Notification API-Klassen zusammen mit dem S3-Modul (`aws-java-sdk-s3`artifactId) transitiv importiert. In Version 2 müssen Sie jedoch eine Abhängigkeit vom Artefakt hinzufügen. `s3-event-notifications`


****  

| Änderungen | v1 |   v2 | 
| --- | --- | --- | 
|    Maven-Abhängigkeiten  |  <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>  | 
| Package name | com.amazonaws.services.s3.event | software.amazon.awssdk.eventnotifications.s3.model | 
| Klassennamen |  [S3EventNotification](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/event/S3EventNotification.html) [S3 EventNotification S.3 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) [S3EventNotification. BucketEntity](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/event/S3EventNotification.S3BucketEntity.html) [S3 S.3-Entität EventNotification](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/event/S3EventNotification.S3Entity.html) [EventNotificationS3. S3 ObjectEntity](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/event/S3EventNotification.S3ObjectEntity.html) [S3EventNotification. TransitionEventDataEntity](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/event/S3EventNotification.TransitionEventDataEntity.html) [S3EventNotification. UserIdentityEntity](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/event/S3EventNotification.UserIdentityEntity.html)  |   [S3EventNotification](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/eventnotifications/s3/model/S3EventNotification.html) [S3EventNotificationRecord](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/eventnotifications/s3/model/S3EventNotificationRecord.html) [GlacierEventData](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/eventnotifications/s3/model/GlacierEventData.html) [IntelligentTieringEventData](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/eventnotifications/s3/model/IntelligentTieringEventData.html) [LifecycleEventData](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/eventnotifications/s3/model/LifecycleEventData.html) [ReplicationEventData](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/eventnotifications/s3/model/ReplicationEventData.html) [RequestParameters](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/eventnotifications/s3/model/RequestParameters.html) [ResponseElements](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/eventnotifications/s3/model/ResponseElements.html) [RestoreEventData](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/eventnotifications/s3/model/RestoreEventData.html) [S3 Bucket](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/eventnotifications/s3/model/S3Bucket.html) [S3](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/eventnotifications/s3/model/S3.html) [S3-Objekt](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 [Letzte Version](https://central.sonatype.com/artifact/software.amazon.awssdk/bom).

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

### JSON zu `S3EventNotification` und umgekehrt
<a name="migration-s3-event-notification-API-changes-conv"></a>


| Anwendungsfall | v1 |   v2 | 
| --- | --- | --- | 
| S3EventNotificationAus einer JSON-Zeichenfolge erstellen |  <pre>S3EventNotification notification = <br />        S3EventNotification.parseJson(message.body());</pre>  |  <pre>S3EventNotification notification = <br />        S3EventNotification.fromJson(message.body());</pre>  | 
| In S3EventNotification eine JSON-Zeichenfolge konvertieren |  <pre>String json = notification.toJson();</pre>  |  <pre>String json = notification.toJson();</pre>  | 

### Greifen Sie auf Attribute von zu `S3EventNotification`
<a name="migration-s3-event-notification-API-changes-attr"></a>


| Anwendungsfall | v1 |   v2 | 
| --- | --- | --- | 
| Datensätze aus einer Benachrichtigung abrufen |  <pre>List<S3EventNotification.S3EventNotificationRecord> records = <br />        notifcation.getRecords();</pre>  |  <pre>List<S3EventNotificationRecord> records = <br />        notification.getRecords();</pre>  | 
| Rufen Sie einen Datensatz aus einer Liste von Datensätzen ab |  <pre>S3EventNotification.S3EventNotificationRecord record = <br />        records.stream().findAny().get();</pre>  |  <pre>S3EventNotificationRecord record = <br />        records.stream().findAny().get();</pre>  | 
| Rufen Sie Glacier-Ereignisdaten ab |  <pre>S3EventNotification.GlacierEventDataEntity glacierEventData =<br />        record.getGlacierEventData();</pre>  |  <pre>GlacierEventData glacierEventData = <br />        record.getGlacierEventData();</pre>  | 
| Rufen Sie Wiederherstellungsdaten von einem Glacier-Ereignis ab |  <pre>S3EventNotification.RestoreEventDataEntity restoreEventData = <br />        glacierEventData.getRestoreEventDataEntity();</pre>  |  <pre>RestoreEventData restoreEventData = <br />        glacierEventData.getRestoreEventData();</pre>  | 
| Abrufen der Anforderungsparameter |  <pre>S3EventNotification.RequestParametersEntity requestParameters = <br />        record.getRequestParameters();</pre>  |  <pre>RequestParameters requestParameters = <br />        record.getRequestParameters();</pre>  | 
| Rufen Sie Intelligent Tiering-Ereignisdaten ab |  <pre>S3EventNotification.IntelligentTieringEventDataEntity tieringEventData = <br />        record.getIntelligentTieringEventData();</pre>  |  <pre>IntelligentTieringEventData intelligentTieringEventData = <br />        record.getIntelligentTieringEventData();</pre>  | 
| Lebenszyklus-Ereignisdaten abrufen |  <pre>S3EventNotification.LifecycleEventDataEntity lifecycleEventData = <br />        record.getLifecycleEventData();</pre>  |  <pre>LifecycleEventData lifecycleEventData = <br />        record.getLifecycleEventData();</pre>  | 
| Rufen Sie den Ereignisnamen als Enum ab |  <pre>S3Event eventNameAsEnum = record.getEventNameAsEnum();</pre>  |  <pre>//getEventNameAsEnum does not exist; use 'getEventName()'<br />String eventName = record.getEventName();</pre>  | 
| Daten zu Replikationsereignissen abrufen |  <pre>S3EventNotification.ReplicationEventDataEntity replicationEntity = <br />        record.getReplicationEventDataEntity();</pre>  |  <pre>ReplicationEventData replicationEventData = <br />        record.getReplicationEventData();</pre>  | 
| Rufen Sie S3-Bucket- und Objektinformationen ab |  <pre>S3EventNotification.S3Entity s3 = record.getS3();</pre>  |  <pre>S3 s3 = record.getS3();</pre>  | 
| Rufen Sie Informationen zur Benutzeridentität ab |  <pre>S3EventNotification.UserIdentityEntity userIdentity = <br />        record.getUserIdentity();</pre>  |  <pre>UserIdentity userIdentity = <br />        record.getUserIdentity();</pre>  | 
| Antwortelemente abrufen |  <pre>S3EventNotification.ResponseElementsEntity responseElements = <br />        record.getResponseElements();</pre>  |  <pre>ResponseElements responseElements = <br />        record.getResponseElements();</pre>  | 

## Migrieren Sie die `aws-lambda-java-events` Bibliotheksversion
<a name="migration-s3-events-notification-lambda-lib"></a>

Wenn Sie [aws-lambda-java-events](https://github.com/aws/aws-lambda-java-libs/tree/main/aws-lambda-java-events)früher mit S3-Benachrichtigungsereignissen innerhalb einer Lambda-Funktion arbeiten, empfehlen wir Ihnen, auf die neueste 3.x.x-Version zu aktualisieren. Neuere Versionen beseitigen alle Abhängigkeiten von AWS SDK für Java 1.x von der S3-API für Ereignisbenachrichtigungen.

Weitere Informationen zu den Unterschieden bei der Behandlung von S3-Ereignisbenachrichtigungen zwischen der `aws-lambda-java-events` Bibliothek und dem SDK for Java 2.x finden Sie unter[S3-Ereignisse in Lambda mit Java-Bibliotheken verarbeiten: AWS SDK for Java 2.x und `aws-lambda-java-events`](examples-s3-event-notifications.md#s3-event-notif-processing-options).

# Änderungen an der Profildatei
<a name="migration-profile-file"></a>

Der AWS SDK for Java 2.x analysiert die Profildefinitionen in `~/.aws/config` und emuliert `~/.aws/credentials` die Art und Weise, wie die AWS CLI die Dateien analysiert, genauer.

Das SDK for Java 2.x:
+ Löst ein `~/` oder, `~` gefolgt vom standardmäßigen Pfadtrennzeichen des Dateisystems am Anfang des Pfads auf, indem der Reihe nach,`$HOME`, `$USERPROFILE` (nur Windows),`$HOMEDRIVE`, `$HOMEPATH` (nur Windows) und dann die `user.home` Systemeigenschaft überprüft wird.
+ Sucht nach der `AWS_SHARED_CREDENTIALS_FILE` Umgebungsvariablen statt nach. `AWS_CREDENTIAL_PROFILES_FILE`
+ Löscht automatisch Profildefinitionen in Konfigurationsdateien ohne das Wort `profile` am Anfang des Profilnamens.
+ Löscht automatisch Profildefinitionen, die nicht aus alphanumerischen Zeichen, Unterstrichen oder Bindestrichen bestehen (nachdem das führende `profile` Wort aus Konfigurationsdateien entfernt wurde).
+ Führt Einstellungen von Profildefinitionen zusammen, die in derselben Datei dupliziert wurden.
+ Führt Einstellungen von Profildefinitionen zusammen, die sowohl in der Konfiguration als auch in der Anmeldeinformationsdatei dupliziert wurden.
+ Führt die Einstellungen NICHT zusammen, wenn `[profile foo]` sich beide in derselben Datei `[foo]` befinden.
+ Verwendet Einstellungen in`[profile foo]`, wenn `[profile foo]` sowohl als auch in der Konfigurationsdatei enthalten `[foo]` sind.
+ Verwendet den Wert der letzten duplizierten Einstellung in derselben Datei und demselben Profil.
+ Erkennt beide `;` und dient `#` zur Definition eines Kommentars.
+ Erkennt `;` und `#` in Profildefinitionen zur Definition eines Kommentars, auch wenn die Zeichen neben der schließenden Klammer stehen.
+ Erkennt `;` und `#` definiert einen Kommentar nur in der Einstellung von Werten, denen Leerzeichen vorangestellt sind.
+ Erkennt `;` und `#` und alle nachfolgenden Inhalte beim Setzen von Werten, wenn ihnen keine Leerzeichen vorangestellt sind.
+ Betrachtet rollenbasierte Anmeldeinformationen als Anmeldeinformationen mit der höchsten Priorität. Das 2.x SDK verwendet immer rollenbasierte Anmeldeinformationen, wenn der Benutzer die Eigenschaft angibt. `role_arn`
+ Betrachtet sitzungsbasierte Anmeldeinformationen als Anmeldeinformationen. second-highest-priority Das 2.x SDK verwendet immer sitzungsbasierte Anmeldeinformationen, wenn keine rollenbasierten Anmeldeinformationen verwendet wurden und der Benutzer die Eigenschaften und angibt. `aws_access_key_id` `aws_session_token`
+ Verwendet grundlegende Anmeldeinformationen, wenn keine rollen- und sitzungsbasierten Anmeldeinformationen verwendet werden und der Benutzer die Eigenschaft angegeben hat. `aws_access_key_id`

# Änderungen an Umgebungsvariablen und Systemeigenschaften
<a name="migration-env-and-system-props"></a>


| 1.x-Umgebungsvariable | 1.x-Systemeigenschaft | 2.x Umgebungsvariable | 2.x-Systemeigenschaft | 
| --- | --- | --- | --- | 
| 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 | Nicht unterstützt ([Anforderungsfunktion](https://github.com/aws/aws-sdk-java-v2/issues/new)) | Nicht unterstützt ([Anforderungsfunktion](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
|   | com.amazonaws.sdk.enableDefaultMetrics | [Wird nicht unterstützt](https://github.com/aws/aws-sdk-java-v2/issues/23) | [Wird nicht unterstützt](https://github.com/aws/aws-sdk-java-v2/issues/23) | 
|   | com.amazonaws.sdk.enableThrottledRetry | [Wird nicht unterstützt](https://github.com/aws/aws-sdk-java-v2/issues/645) | [Wird nicht unterstützt](https://github.com/aws/aws-sdk-java-v2/issues/645) | 
|   | com.amazonaws.regions.RegionUtils.fileOverride | Nicht unterstützt ([Anforderungsfunktion](https://github.com/aws/aws-sdk-java-v2/issues/new)) | Nicht unterstützt ([Anforderungsfunktion](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
|   | com.amazonaws.regions.RegionUtils.disableRemote | Nicht unterstützt ([Anforderungsfunktion](https://github.com/aws/aws-sdk-java-v2/issues/new)) | Nicht unterstützt ([Anforderungsfunktion](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
|   | com.amazonaws.services.s3.disableImplicitGlobalClients | Nicht unterstützt ([Anforderungsfunktion](https://github.com/aws/aws-sdk-java-v2/issues/new)) | Nicht unterstützt ([Anforderungsfunktion](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 
|   | com.amazonaws.sdk.enableInRegionOptimizedMode | Nicht unterstützt ([Anforderungsfunktion](https://github.com/aws/aws-sdk-java-v2/issues/new)) | Nicht unterstützt ([Anforderungsfunktion](https://github.com/aws/aws-sdk-java-v2/issues/new)) | 

# Änderungen in Waiters von Version 1 zu Version 2
<a name="migration-waiters"></a>

In diesem Thema werden die Änderungen der Funktionalität von Waiters von Version 1 (v1) auf Version 2 (v2) beschrieben.

In den folgenden Tabellen wird der Unterschied speziell für DynamoDB-Kellner veranschaulicht. Kellner für andere Dienste folgen demselben Muster.

## Änderungen auf hoher Ebene
<a name="migration-waiters-api-changes"></a>

Die Kurse für Kellner finden im selben Maven-Artefakt statt wie der Service. 


| Änderung | v1 | v2 | 
| --- | --- | --- | 
|    Abhängigkeiten von Maven  |  <pre><dependencyManagement><br />    <dependencies><br />        <dependency><br />            <groupId>com.amazonaws</groupId><br />            <artifactId>aws-java-sdk-bom</artifactId><br />            <version>1.12.6801</version><br />            <type>pom</type><br />            <scope>import</scope><br />        </dependency><br />    </dependencies><br /></dependencyManagement><br /><dependencies><br />    <dependency><br />        <groupId>com.amazonaws</groupId><br />        <artifactId>dynamodb</artifactId><br />    </dependency><br /></dependencies><br /></pre>  |  <pre><dependencyManagement><br />    <dependencies><br />        <dependency><br />            <groupId>software.amazon.awssdk</groupId><br />            <artifactId>bom</artifactId><br />            <version>2.27.102</version><br />            <type>pom</type><br />            <scope>import</scope><br />        </dependency><br />    </dependencies><br /></dependencyManagement><br /><dependencies><br />    <dependency><br />        <groupId>software.amazon.awssdk</groupId><br />        <artifactId>dynamodb</artifactId><br />    </dependency><br /></dependencies></pre>  | 
| Package name | com.amazonaws.services.dynamodbv2.waiters | software.amazon.awssdk.services.dynamodb.waiters | 
| Klassennamen |  `[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/de_de/sdk-for-java/latest/developer-guide/migration-waiters.html)  | 

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

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


| Änderung | v1 | v2 | 
| --- | --- | --- | 
| Erstelle einen Kellner |  <pre>AmazonDynamoDB client = AmazonDynamoDBClientBuilder <br />                            .standard().build();<br />AmazonDynamoDBWaiters waiter = client.waiters();</pre>  | Synchron:<pre>DynamoDbClient client = DynamoDbClient.create();<br />DynamoDbWaiter waiter = client.waiter();</pre>Asynchron:<pre>DynamoDbAsyncClient asyncClient = <br />        DynamoDbAsyncClient.create();<br />DynamoDbAsyncWaiter waiter = asyncClient.waiter();</pre> | 
| Warte, bis eine Tabelle existiert | Synchron:<pre>waiter.tableExists()<br />    .run(new WaiterParameters<>(<br />        new DescribeTableRequest(tableName)));</pre>Asynchron:<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> |  Synchron: <pre>WaiterResponse<DescribeTableResponse> waiterResponse =<br />    waiter.waitUntilTableExists(<br />        r -> r.tableName("myTable"));<br />waiterResponse.matched().response()<br />       .ifPresent(System.out::println);</pre> Asynchron: <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>  | 

## Konfigurationsänderungen
<a name="migration-waiters-config"></a>


| Änderung | v1 | v2 | 
| --- | --- | --- | 
| Abfragestrategie (maximale Anzahl Versuche und feste Verzögerung) |  <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>  | 

# Änderungen im EC2-Metadaten-Hilfsprogramm von Version 1 zu Version 2
<a name="migration-imds"></a>

In diesem Thema werden die Änderungen im Metadaten-Hilfsprogramm SDK for Java Amazon Elastic Compute Cloud (EC2) von Version 1 (v1) auf Version 2 (v2) beschrieben.

## Änderungen auf hoher Ebene
<a name="migration-imds-high-level-changes"></a>


****  

| Änderungen | v1 |   v2 | 
| --- | --- | --- | 
|    Maven-Abhängigkeiten  |  <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>  | 
| Package name |  com.amazonaws.util  |  software.amazon.awssdk.imds  | 
| Instanziierungsansatz |  Verwenden Sie statische Hilfsmethoden; keine Instanziierung: <pre>String localHostName = <br />           EC2MetadataUtils.getLocalHostName();</pre>  |  Verwenden Sie eine statische Factory-Methode: <pre>Ec2MetadataClient client = Ec2MetadataClient.create();</pre> Oder verwenden Sie einen Builder-Ansatz: <pre>Ec2MetadataClient client = Ec2MetadataClient.builder()<br />    .endpointMode(EndpointMode.IPV6)<br />    .build();</pre>  | 
| Arten von Kunden | Nur synchrone Hilfsmethoden: EC2MetadataUtils |  Synchron: `Ec2MetadataClient` Asynchron: `Ec2MetadataAsyncClient`  | 

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

3 Beachten Sie die Deklaration des `apache-client` Moduls für v2. V2 des EC2-Metadaten-Dienstprogramms erfordert eine Implementierung der `SdkHttpClient` Schnittstelle für den synchronen Metadaten-Client oder der `SdkAsyncHttpClient` Schnittstelle für den asynchronen Metadaten-Client. Der [Konfigurieren Sie HTTP-Clients in der AWS SDK for Java 2.x](http-configuration.md) Abschnitt zeigt die Liste der HTTP-Clients, die Sie verwenden können.

### Metadaten anfordern
<a name="migration-imds-fetching-changes"></a>

In Version 1 verwenden Sie statische Methoden, die keine Parameter akzeptieren, um Metadaten für eine EC2-Ressource anzufordern. Im Gegensatz dazu müssen Sie in v2 den Pfad zur EC2-Ressource als Parameter angeben. Die folgende Tabelle zeigt die verschiedenen Ansätze.


****  

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

Den Pfad, den Sie angeben müssen, um [Metadaten anzufordern, finden Sie in den Kategorien der Instanz-Metadaten](https://docs.aws.amazon.com//AWSEC2/latest/UserGuide/instancedata-data-categories.html). 

**Anmerkung**  
Wenn Sie in Version 2 einen Instanz-Metadaten-Client verwenden, sollten Sie versuchen, für alle Anfragen zum Abrufen von Metadaten denselben Client zu verwenden.

 

## Verhaltensänderungen
<a name="migration-imds-behavior-changes"></a>

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

Auf EC2 gibt der lokal ausgeführte Instance Metadata Service (IMDS) einige Metadaten als Zeichenketten im JSON-Format zurück. Ein solches Beispiel sind die dynamischen Metadaten eines [Instanz-Identdokuments](https://docs.aws.amazon.com//AWSEC2/latest/UserGuide/instance-identity-documents.html).

Die v1-API enthält separate Methoden für jeden Teil der Instanzidentitätsmetadaten, wohingegen die v2-API die JSON-Zeichenfolge direkt zurückgibt. Um mit der JSON-Zeichenfolge zu arbeiten, können Sie die [Dokument-API](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/core/document/package-summary.html) verwenden, um die Antwort zu analysieren und in der JSON-Struktur zu navigieren.

In der folgenden Tabelle wird verglichen, wie Sie Metadaten eines Instanzidentitätsdokuments in Version 1 und Version 2 abrufen.


****  

| Anwendungsfall | v1 |   v2 | 
| --- | --- | --- | 
| Rufen Sie die Region ab |  <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>  | 
| Rufen Sie die Instanz-ID ab |  <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>  | 
| Rufen Sie den Instanztyp ab |  <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>  | 

### Unterschiede bei der Auflösung von Endpunkten
<a name="migration-imds-behavior-endpoint-res"></a>

Die folgende Tabelle zeigt die Speicherorte, nach denen das SDK sucht, um den Endpunkt nach IMDS aufzulösen. Die Standorte sind mit absteigender Priorität aufgeführt.


****  

| v1 |   v2 | 
| --- | --- | 
| Systemeigenschaft: com.amazonaws.sdk.ec2MetadataServiceEndpointOverride | Konfigurationsmethode für den Client Builder: endpoint(...) | 
| Umgebungsvariable: AWS\$1EC2\$1METADATA\$1SERVICE\$1ENDPOINT | Systemeigenschaft: aws.ec2MetadataServiceEndpoint | 
| Standardwert: http://169.254.169.254 | Konfigurationsdatei: \$1.aws/config mit der ec2\$1metadata\$1service\$1endpoint Einstellung | 
|  | Wert, der mit „gelöst“ verknüpft ist endpoint-mode  | 
|  | Standardwert: http://169.254.169.254 | 

### Endpunktauflösung in Version 2
<a name="migration-imds-behavior-endpoint-res2"></a>

Wenn Sie mithilfe des Builders explizit einen Endpunkt festlegen, hat dieser Endpunktwert Vorrang vor allen anderen Einstellungen. Wenn der folgende Code ausgeführt wird, werden die `aws.ec2MetadataServiceEndpoint` Systemeigenschaft und die `ec2_metadata_service_endpoint` Einstellung der Konfigurationsdatei ignoriert, sofern sie existieren.

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

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

Mit v2 können Sie einen Endpunktmodus angeben, um den Metadaten-Client so zu konfigurieren, dass er die Standard-Endpunktwerte für oder verwendet. IPv4 IPv6 Der Endpunktmodus ist für Version 1 nicht verfügbar. Der für verwendete Standardwert IPv4 ist `http://169.254.169.254` und `http://[fd00:ec2::254]` für. IPv6

Die folgende Tabelle zeigt die verschiedenen Möglichkeiten, wie Sie den Endpunktmodus nach absteigender Priorität einstellen können.


****  

|  |  | Mögliche Werte | 
| --- | --- | --- | 
| Client-Builder-Konfigurationsmethode: endpointMode(...) |  <pre>Ec2MetadataClient client = Ec2MetadataClient<br />  .builder()<br />  .endpointMode(EndpointMode.IPV4)<br />  .build();</pre>  | EndpointMode.IPV4, EndpointMode.IPV6 | 
| Systemeigenschaft | aws.ec2MetadataServiceEndpointMode | IPv4, IPv6 (Groß- und Kleinschreibung spielt keine Rolle) | 
| Konfigurationsdatei: \$1.aws/config | ec2\$1metadata\$1service\$1endpoint-Einstellung | IPv4, IPv6 (Groß- und Kleinschreibung spielt keine Rolle) | 
| Auf die vorherigen Arten nicht angegeben | IPv4 wird verwendet |  | 

#### Wie das SDK auflöst `endpoint` oder `endpoint-mode` in v2
<a name="migration-imds-behavior-endpoint-res2-which"></a>

1. Das SDK verwendet den Wert, den Sie im Code auf dem Client Builder festgelegt haben, und ignoriert alle externen Einstellungen. Da das SDK bei beiden eine Ausnahme auslöst `endpoint` und `endpointMode` im Client Builder aufgerufen wird, verwendet das SDK den Endpunktwert der von Ihnen verwendeten Methode.

1. Wenn Sie keinen Wert im Code festlegen, sucht das SDK nach einer externen Konfiguration — zuerst nach Systemeigenschaften und dann nach einer Einstellung in der Konfigurationsdatei. 

   1. Das SDK sucht zunächst nach einem Endpunktwert. Wenn ein Wert gefunden wird, wird er verwendet. 

   1. Wenn das SDK immer noch keinen Wert gefunden hat, sucht das SDK nach Einstellungen für den Endpunktmodus.

1. Wenn das SDK schließlich keine externen Einstellungen findet und Sie den Metadaten-Client nicht im Code konfiguriert haben, verwendet das SDK den IPv4 Wert von`http://169.254.169.254`.

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

Amazon EC2 definiert zwei Ansätze für den Zugriff auf Instance-Metadaten:
+ Instance-Metadaten-Service Version 1 (IMDSv1) — Anforderungs-/Antwort-Ansatz
+ Instanz-Metadatendienst Version 2 (IMDSv2) — Sitzungsorientierter Ansatz

In der folgenden Tabelle wird verglichen, wie Java mit SDKs IMDS funktioniert.


****  

| v1 |   v2 | 
| --- | --- | 
| IMDSv2 wird standardmäßig verwendet | Benutzt immer IMDSv2 | 
| Versucht, für jede Anfrage ein Sitzungstoken abzurufen, und greift darauf zurück, IMDSv1 wenn ein Sitzungstoken nicht abgerufen werden kann | Speichert ein Sitzungstoken in einem internen Cache, der für mehrere Anfragen wiederverwendet wird | 

Das SDK for Java 2.x unterstützt nur IMDSv2 und greift nicht darauf IMDSv1 zurück.

## Unterschiede in der Konfiguration
<a name="migration-imds-config-diffs"></a>

In der folgenden Tabelle sind die unterschiedlichen Konfigurationsoptionen aufgeführt.


****  

| Konfiguration | v1 |   v2 | 
| --- | --- | --- | 
| Erneute Versuche | Konfiguration nicht verfügbar | Konfigurierbar über die Builder-Methode retryPolicy(...) | 
| HTTP | Verbindungs-Timeout, konfigurierbar über die AWS\$1METADATA\$1SERVICE\$1TIMEOUT Umgebungsvariable. Die Standardeinstellung ist 1 Sekunde. | Die Konfiguration ist verfügbar, indem ein HTTP-Client an die Builder-Methode übergeben wirdhttpClient(...). Das Standard-Verbindungstimeout für HTTP-Clients beträgt 2 Sekunden. | 

### Beispiel für eine v2-HTTP-Konfiguration
<a name="migration-imds-http-conf-v2-ex"></a>

Das folgende Beispiel zeigt, wie Sie den Metadaten-Client konfigurieren können. In diesem Beispiel wird das Verbindungstimeout konfiguriert und der Apache HTTP-Client verwendet.

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

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

# Änderungen bei CloudFront Amazon-Presignierung von Version 1 zu Version 2
<a name="migration-cloudfront-presigning"></a>

In diesem Thema werden die Änderungen in Amazon CloudFront von Version 1 (v1) zu Version 2 (v2) beschrieben.

## Änderungen auf hoher Ebene
<a name="migration-cloudfront-presigning-api-changes"></a>


****  

| Änderungen | v1 |   v2 | 
| --- | --- | --- | 
|    Maven-Abhängigkeiten  |  <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>  | 
| Package name | com.amazonaws.services.cloudfront | software.amazon.awssdk.services.cloudfront | 
| Klassennamen |  [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 [Letzte Version](https://central.sonatype.com/artifact/com.amazonaws/aws-java-sdk-bom). 2 [Letzte Version](https://central.sonatype.com/artifact/software.amazon.awssdk/bom).

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


| Behavior | v1 |   v2 | 
| --- | --- | --- | 
| Erstellen Sie eine vorgefertigte Anfrage | Argumente werden direkt an die API übergeben. |  <pre>CannedSignerRequest cannedRequest =<br />      CannedSignerRequest.builder()<br />                         .resourceUrl(resourceUrl)<br />                         .privateKey(privateKey)<br />                         .keyPairId(keyPairId)<br />                         .expirationDate(expirationDate)<br />                         .build();</pre>  | 
| Erstellen Sie eine benutzerdefinierte Anfrage | Argumente werden direkt an die API übergeben. |  <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>  | 
| Generieren Sie eine signierte URL (gesperrt) |  <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>  | 
| Generieren Sie ein signiertes Cookie (benutzerdefiniert) |  <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>  | 

### Überarbeitete Cookie-Header in Version 2
<a name="migration-cf-presign-behavior-headers"></a>

In Java v1 liefert das Java-SDK Cookie-Header als. `Map.Entry<String, String>`

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

Das Java v2 SDK liefert den gesamten Header als einen einzigen`String`.

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

# Änderungen an der IAM Policy Builder-API von Version 1 zu Version 2
<a name="migration-iam-policy-builder"></a>

In diesem Thema werden die Änderungen an der IAM Policy Builder-API von Version 1 (v1) auf Version 2 (v2) beschrieben.

## Änderungen auf hoher Ebene
<a name="migration-iam-policy-builder-high-level"></a>


****  

| Änderungen | v1 |   v2 | 
| --- | --- | --- | 
|    Maven-Abhängigkeiten  |  <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>  | 
| Package name | com.amazonaws.auth.policy | software.amazon.awssdk.policybuilder.iam | 
| Klassennamen |  [Richtlinie](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/policy/Policy.html) [Statement](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/policy/Statement.html) [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/de_de/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/de_de/sdk-for-java/latest/developer-guide/migration-iam-policy-builder.html)  | 

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

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


****  

| Einstellung | v1 |   v2 | 
| --- | --- | --- | 
|  Instanziieren Sie eine Richtlinie |  <pre>Policy policy = new Policy();</pre>  |  <pre>IamPolicy.Builder policyBuilder = IamPolicy.builder();<br />...<br />IamPolicy policy = policyBuilder.build();</pre>  | 
|    ID festlegen  |  <pre>policy.withtId(...);<br />policy.setId(...);</pre>  |  <pre>policyBuilder.id(...);</pre>  | 
|    Version festlegen  | N/A — verwendet die Standardversion von 2012-10-17 |  <pre>policyBuilder.version(...);</pre>  | 
|    Aussage erstellen  |  <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>  | 
|    Aussage festlegen  |  <pre>policy.withStatements(statement);<br />policy.setStatements(statement);</pre>  |  <pre>policyBuilder.addStatement(statement);</pre>  | 

## Unterschiede beim Aufbau einer Aussage
<a name="migration-iam-policy-builder-statement"></a>

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

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

Das v1-SDK verfügt über [`enum`Typen](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/policy/Action.html) für Serviceaktionen, die `[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)` Elemente einer Richtlinienerklärung darstellen. Die folgenden `enum` Typen sind einige Beispiele.
+ `[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)`

Das folgende Beispiel zeigt die `SendMessage` Konstante für`SQSActions`.

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

In Version 1 können Sie kein `[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)` Element für eine Anweisung angeben.

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

In Version 2 repräsentiert die [IamAction](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/policybuilder/iam/IamAction.html)Schnittstelle alle Aktionen. Um ein [dienstspezifisches Aktionselement](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_action.html) anzugeben, übergeben Sie eine Zeichenfolge an die `create` Methode, wie im folgenden Code gezeigt.

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

Sie können a `[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)` für eine Anweisung mit v2 angeben, wie im folgenden Code gezeigt.

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

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

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

Zur Darstellung von Anweisungsbedingungen verwendet das v1-SDK Unterklassen von [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)

Jede `Condition` Unterklasse definiert einen `enum` Vergleichstyp, der bei der Definition der Bedingung hilft. Im Folgenden wird beispielsweise ein [Vergleich einer Zeichenfolge](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String), die *nicht ähnlich ist*, für eine Bedingung dargestellt.

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

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

In Version 2 erstellen Sie eine Bedingung für eine Richtlinienanweisung, indem Sie eine`[IamConditionOperator](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/policybuilder/iam/IamConditionOperator.html)`, die `enums` für alle Typen enthält, verwenden `[IamCondition](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/policybuilder/iam/IamCondition.html)` und bereitstellen.

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

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

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

Das `[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)` Element einer Richtlinienerklärung wird durch die `[Resource](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/policy/Resource.html)` Klasse des SDK repräsentiert. Sie geben den ARN als Zeichenfolge im Konstruktor an. Die folgenden Unterklassen bieten praktische Konstruktoren.
+ [S3BucketResource](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/policy/resources/S3BucketResource.html)
+ [S3ObjectResource](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/policy/resources/S3ObjectResource.html)
+ [SQSQueueRessource](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/policy/resources/SQSQueueResource.html)

In Version 1 können Sie ein `[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)` Element für a angeben, `[Resource](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/policy/Resource.html)` indem Sie die `withIsNotType` Methode aufrufen, wie in der folgenden Anweisung gezeigt.

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

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

In v2 erstellen Sie ein `[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)` Element, indem Sie der `IamResource.create` Methode einen ARN übergeben.

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

An `[IamResource](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/policybuilder/iam/IamResource.html)` kann als *[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)*Element festgelegt werden, wie im folgenden Snippet gezeigt.

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

`IamResource.ALL`steht für alle Ressourcen. 

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

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

Das v1-SDK bietet die folgenden `[Principal](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/policy/Principal.html)` Klassen, um Typen von Prinzipalen darzustellen, die alle Mitglieder umfassen:
+ `AllUsers`
+ `AllServices`
+ `AllWebProviders`
+ `All`

Sie können einer Anweisung kein `[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)` Element hinzufügen.

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

Steht in v2 `IamPrincipal.ALL` für alle Prinzipale:

Um alle Mitglieder in anderen Typen von Prinzipalen darzustellen, verwenden Sie die `[IamPrincipalType](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/policybuilder/iam/IamPrincipalType.html)` Klassen, wenn Sie eine erstellen. `IamPrincipal`
+ `IamPrincipal.create(IamPrincipalType.AWS,"*")`für alle Benutzer.
+ `IamPrincipal.create(IamPrincipalType.SERVICE,"*")`für alle Dienste.
+ `IamPrincipal.create(IamPrincipalType.FEDERATED,"*")`für alle Webprovider.
+ `IamPrincipal.create(IamPrincipalType.CANONICAL_USER,"*")`für alle kanonischen Benutzer.

Sie können die `addNotPrincipal` Methode verwenden, um ein `[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)` Element darzustellen, wenn Sie eine Richtlinienerklärung erstellen, wie in der folgenden Anweisung gezeigt.

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

# Änderungen bei der Arbeit mit DynamoDB von Version 1 zu Version 2 von AWS SDK für Java
<a name="migration-ddb-mapper"></a>



**Topics**
+ [Unterschiede der DynamoDB-Mapping-API zwischen Version 1 und Version 2 von AWS SDK für Java](ddb-mapping.md)
+ [Dokumentieren Sie die API-Unterschiede zwischen Version 1 und Version 2 von AWS SDK für Java](dynamodb-mapping-document-api.md)
+ [Migration der Verschlüsselungsbibliothek](ddb-encryption-lib-migrate.md)

# Unterschiede der DynamoDB-Mapping-API zwischen Version 1 und Version 2 von AWS SDK für Java
<a name="ddb-mapping"></a>

Die DynamoDB-Zuordnung APIs hat sich zwischen Version 1 und Version 2 von erheblich geändert. AWS SDK für Java In Version 1 verwenden Sie den, um mit `DynamoDBMapper` Java zu arbeiten. POJOs In Version 2 verwenden Sie die `DynamoDbEnhancedClient` mit aktualisierten Methodennamen, erweiterten Schemadefinitionsoptionen und verbesserter Typsicherheit.

Zu den wichtigsten Unterschieden gehören:
+ Neue Methodennamen (z. B. `getItem` statt von`load`)
+ Explizite Erstellung eines Tabellenschemas
+ Integrierte Unterstützung für synchrone und asynchrone Operationen
+ Änderungen in der Art und Weise, wie leere Zeichenketten und Konfigurationen behandelt werden

In diesem Abschnitt werden die Änderungen der Mapping-API, Unterschiede in den Anmerkungen, Konfigurationsupdates und Migrationsanleitungen behandelt, die Ihnen beim Übergang von Version 1 `DynamoDBMapper` zu Version 2 helfen sollen`DynamoDbEnhancedClient`.

**Contents**
+ [Änderungen auf hoher Ebene in den Mapping-Bibliotheken von Version 1 zu Version 2 des SDK for Java](dynamodb-mapping-high-level.md)
  + [Unterschiede zwischen Importabhängigkeiten](dynamodb-mapping-high-level.md#dynamodb-mapping-deps)
+ [Änderungen in der DynamoDB-Zuordnung APIs zwischen Version 1 und Version 2 des SDK for Java](dynamodb-mapping-api-changes.md)
  + [Erstellen Sie einen Client](dynamodb-mapping-api-changes.md#dynamodb-mapping-api-changes-client)
  + [Zuordnung zur DynamoDB-Tabelle/zum DynamoDB-Index einrichten](dynamodb-mapping-api-changes.md#dynamodb-mapping-api-changes-mapping)
  + [Tabellenoperationen](dynamodb-mapping-api-changes.md#dynamodb-mapping-api-changes-tobleops)
  + [Ordnen Sie Klassen und Eigenschaften zu](dynamodb-mapping-api-changes.md#dynamodb-mapping-schemas)
    + [Bean-Anmerkungen](dynamodb-mapping-api-changes.md#dynamodb-mapping-schemas-annos)
    + [V2 zusätzliche Anmerkungen](dynamodb-mapping-api-changes.md#dynamodb-mapping-schemas-annos-v2-addnl)
  + [Konfiguration](dynamodb-mapping-api-changes.md#dynamodb-mapping-configuration)
    + [Konfiguration pro Vorgang](dynamodb-mapping-api-changes.md#dynamodb-mapping-configuration-per-op)
  + [Bedingungen](dynamodb-mapping-api-changes.md#dynamodb-mapping-conditionals)
  + [Typkonvertierung](dynamodb-mapping-api-changes.md#dynamodb-mapping-type-conv)
    + [Standardkonverter](dynamodb-mapping-api-changes.md#dynamodb-mapping-type-conv-defaults)
    + [Legen Sie einen benutzerdefinierten Konverter für ein Attribut fest](dynamodb-mapping-api-changes.md#dynamodb-mapping-type-conv-anno)
    + [Fügen Sie einen Typkonverter, eine Fabrik oder einen Anbieter hinzu](dynamodb-mapping-api-changes.md#dynamodb-mapping-type-conv-factory)
+ [Unterschiede im Umgang mit Zeichenketten zwischen Version 1 und Version 2 des SDK for Java](dynamodb-migration-string-handling.md)
+ [Optimistische Sperrunterschiede zwischen Version 1 und Version 2 des SDK for Java](dynamodb-migrate-optimstic-locking.md)
+ [Fluent Setter: Unterschiede zwischen Version 1 und Version 2 des SDK for Java](dynamodb-migrate-fluent-setters.md)

# Änderungen auf hoher Ebene in den Mapping-Bibliotheken von Version 1 zu Version 2 des SDK for Java
<a name="dynamodb-mapping-high-level"></a>

Die Namen der Mapping-Clients in den einzelnen Bibliotheken unterscheiden sich in V1 und V2:
+ V1 — Dynamo DBMapper
+ V2 — Erweiterter DynamoDB-Client

Sie interagieren mit den beiden Bibliotheken auf die gleiche Weise: Sie instanziieren ein mapper/client und stellen dann ein Java-POJO bereit APIs , das diese Elemente liest und in DynamoDB-Tabellen schreibt. Beide Bibliotheken bieten auch Anmerkungen für die Klasse des POJO, um zu steuern, wie der Client mit dem POJO umgeht. 

Zu den bemerkenswerten Unterschieden beim Umstieg auf V2 gehören:
+ V2 und V1 verwenden unterschiedliche Methodennamen für die DynamoDB-Operationen auf niedriger Ebene. Beispiel:    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/de_de/sdk-for-java/latest/developer-guide/dynamodb-mapping-high-level.html)
+ V2 bietet mehrere Möglichkeiten, Tabellenschemas zu definieren und Tabellen POJOs zuzuordnen. Sie können zwischen der Verwendung von Anmerkungen oder einem Schema wählen, das mithilfe eines Builders aus Code generiert wurde. V2 bietet auch veränderbare und unveränderliche Versionen von Schemas.
+ Bei V2 erstellen Sie als einen der ersten Schritte speziell das Tabellenschema, wohingegen in V1 das Tabellenschema nach Bedarf aus der annotierten Klasse abgeleitet wird.
+ V2 beinhaltet den [Document API-Client](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/enhanced/dynamodb/document/EnhancedDocument.html) in der erweiterten Client-API, wohingegen V1 eine [separate](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/document/DynamoDB.html) API verwendet.
+ Alle APIs sind in Version V2 in synchronen und asynchronen Versionen verfügbar.

Ausführlichere Informationen zum erweiterten V2-Client finden Sie im [Abschnitt DynamoDB-Mapping](dynamodb-enhanced-client.md) in diesem Handbuch.

## Unterschiede zwischen Importabhängigkeiten
<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 [Letzte Version](https://central.sonatype.com/artifact/software.amazon.awssdk/bom).

In Version 1 umfasst eine einzelne Abhängigkeit sowohl die DynamoDB-API auf niedriger Ebene als auch die mapping/document API, wohingegen Sie in V2 die `dynamodb-enhanced` Artefaktabhängigkeit verwenden, um auf die API zuzugreifen. mapping/document Das `dynamodb-enhanced` Modul enthält eine transitive Abhängigkeit vom Low-Level-Modul. `dynamodb` 

# Änderungen in der DynamoDB-Zuordnung APIs zwischen Version 1 und Version 2 des SDK for Java
<a name="dynamodb-mapping-api-changes"></a>

## Erstellen Sie einen Client
<a name="dynamodb-mapping-api-changes-client"></a>


****  

| Anwendungsfall | V1 | V2 | 
| --- | --- | --- | 
|   Normale Instanziierung  |  <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>  | 
|   Minimale Instanziierung  |  <pre>AmazonDynamoDB standardClient = AmazonDynamoDBClientBuilder.standard();<br />DynamoDBMapper mapper = new DynamoDBMapper(standardClient);</pre>  |  <pre>DynamoDbEnhancedClient enhancedClient = DynamoDbEnhancedClient.create();</pre>  | 
|   Mit dem Attribut Transformator \$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 Erweiterungen in V2 entsprechen in etwa den Attributtransformatoren in V1. Der [Verwenden Sie Erweiterungen, um DynamoDB Enhanced Client-Operationen anzupassen](ddb-en-client-extensions.md) Abschnitt enthält weitere Informationen zu Erweiterungen in V2. 

## Zuordnung zur DynamoDB-Tabelle/zum DynamoDB-Index einrichten
<a name="dynamodb-mapping-api-changes-mapping"></a>

In V1 geben Sie einen DynamoDB-Tabellennamen über eine Bean-Annotation an. In V2 erzeugt eine Factory-Methode,`table()`, eine Instanz von, `DynamoDbTable` die die Remote-DynamoDB-Tabelle darstellt. Der erste Parameter der `table()` Methode ist der DynamoDB-Tabellenname.


****  

| Anwendungsfall | V1 | V2 | 
| --- | --- | --- | 
|   Ordnen Sie die Java-POJO-Klasse der DynamoDB-Tabelle zu  |  <pre>@DynamoDBTable(tableName ="Customer")<br />public class Customer {<br />  ...<br />}</pre>  |  <pre>DynamoDbTable<Customer> customerTable = enhancedClient.table("Customer",<br />    TableSchema.fromBean(Customer.class));</pre>  | 
|   Einem DynamoDB-Sekundärindex zuordnen  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/de_de/sdk-for-java/latest/developer-guide/dynamodb-mapping-api-changes.html) Der Abschnitt im DynamoDB Developer Guide, in [dem die `query` V1-Methode](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBMapper.Methods.html#DynamoDBMapper.Methods.query) beschrieben wird, enthält ein vollständiges Beispiel.  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/de_de/sdk-for-java/latest/developer-guide/dynamodb-mapping-api-changes.html) Der [Verwenden Sie sekundäre Indizes](ddb-en-client-use-secindex.md) Abschnitt in diesem Handbuch enthält weitere Informationen.  | 

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

In diesem Abschnitt werden Operationen beschrieben APIs , die sich in den meisten Standardanwendungsfällen zwischen V1 und V2 unterscheiden. 

In V2 werden alle Operationen, die eine einzelne Tabelle betreffen, auf der `DynamoDbTable` Instanz aufgerufen, nicht auf dem erweiterten Client. Der erweiterte Client enthält Methoden, die auf mehrere Tabellen abzielen können. 

In der folgenden *Tabelle mit dem Namen Tabellenoperationen* wird eine POJO-Instanz als `item` oder als ein bestimmter Typ bezeichnet, z. B. `customer1` In den V2-Beispielen sind die genannten Instanzen `table` das Ergebnis eines vorherigen Aufrufs`enhancedClient.table()`, der einen Verweis auf die `DynamoDbTable` Instanz zurückgibt.

Beachten Sie, dass die meisten V2-Operationen mit einem fließenden Benutzermuster aufgerufen werden können, auch wenn sie nicht angezeigt werden. Zum Beispiel 

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

Für V1-Operationen enthalten *Tabellenoperationen* (unten) einige der häufig verwendeten Formulare und nicht alle überladenen Formulare. Die `load()` Methode weist beispielsweise die folgenden Überladungen auf:

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

Die *Tabellenoperationen* (unten) zeigen die am häufigsten verwendeten Formen:

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


**Tabellenoperationen**  

| Anwendungsfall | V1 | V2 | 
| --- | --- | --- | 
|  Schreiben Sie ein Java-POJO in eine DynamoDB-Tabelle **DynamoDB-Betrieb**:, `PutItem` `UpdateItem`  |  <pre>mapper.save(item)<br />mapper.save(item, config)<br />mapper.save(item, saveExpression, config)</pre> In V1 bestimmen `DynamoDBMapperConfig.SaveBehavior` Annotationen, welche Low-Level-DynamoDB-Methode aufgerufen wird. Wird im Allgemeinen aufgerufen, außer wenn und verwendet `UpdateItem` wird. `SaveBehavior.CLOBBER` `SaveBehavior.PUT` Automatisch generierte Schlüssel sind ein besonderer Anwendungsfall, und gelegentlich `UpdateItem` werden beide `PutItem` verwendet.  |  <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>  | 
|  Ein Element aus einer DynamoDB-Tabelle in ein Java-POJO lesen **DynamoDB-Betrieb:** `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>  | 
|  Löschen Sie ein Element aus einer DynamoDB-Tabelle **DynamoDB-Betrieb:** `DeleteItem`  |  <pre>mapper.delete(item, deleteExpression, config)</pre>  |  <pre>table.deleteItem(deleteItemRequest)<br />table.deleteItem(item)<br />table.deleteItem(key)</pre>  | 
|  Fragen Sie eine DynamoDB-Tabelle oder einen sekundären Index ab und geben Sie eine paginierte Liste zurück **DynamoDB-Betrieb:** `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> Verwenden Sie die zurückgegebenen Daten `PageIterable.stream()` (verzögertes Laden) für Synchronisationsantworten und `PagePublisher.subscribe()` für asynchrone Antworten  | 
|  Eine DynamoDB-Tabelle oder einen sekundären Index abfragen und eine Liste zurückgeben **DynamoDB-Betrieb:** `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> Verwenden Sie die zurückgegebenen Daten `PageIterable.items()` (verzögertes Laden) für Synchronisationsantworten und `PagePublisher.items.subscribe()` für asynchrone Antworten  | 
|  Scannen Sie eine DynamoDB-Tabelle oder einen sekundären Index und geben Sie eine paginierte Liste zurück **DynamoDB-Betrieb:** `Scan`  |  <pre>mapper.scan(Customer.class, scanExpression)<br />mapper.scan(Customer.class, scanExpression, <br />                            mapperConfig)</pre>  |  <pre>table.scan()<br />table.scan(scanRequest)</pre> Verwenden Sie die zurückgegebenen Daten `PageIterable.stream()` (verzögertes Laden) für Synchronisationsantworten und `PagePublisher.subscribe()` für asynchrone Antworten  | 
|  Eine DynamoDB-Tabelle oder einen sekundären Index scannen und eine Liste zurückgeben **DynamoDB-Betrieb:** `Scan`  |  <pre>mapper.scanPage(Customer.class, scanExpression)<br />mapper.scanPage(Customer.class, scanExpression, <br />                                mapperConfig)</pre>  |  <pre>table.scan()<br />table.scan(scanRequest)</pre> Verwenden Sie die zurückgegebenen Daten `PageIterable.items()` (verzögertes Laden) für Synchronisationsantworten und `PagePublisher.items.subscribe()` für asynchrone Antworten  | 
|  Lesen Sie mehrere Elemente aus mehreren Tabellen in einem Stapel **DynamoDB-Betrieb:** `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>  | 
|  Schreiben Sie mehrere Elemente in einem Stapel in mehrere Tabellen **DynamoDB-Betrieb:** `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>  | 
|  Löschen Sie mehrere Elemente aus mehreren Tabellen in einem Stapel **DynamoDB-Betrieb:** `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>  | 
|  Schreiben/löschen Sie mehrere Elemente in einem Stapel **DynamoDB-Betrieb:** `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>  | 
|  Führen Sie einen transaktionalen Schreibvorgang durch **DynamoDB-Betrieb:** `TransactWriteItems`  |  <pre>mapper.transactionWrite(transactionWriteRequest)</pre>  |  <pre>enhancedClient.transactWriteItems(transasctWriteItemsRequest)</pre>  | 
|  Führen Sie einen transaktionalen Lesevorgang durch **DynamoDB-Betrieb:** `TransactGetItems`  |  <pre>mapper.transactionLoad(transactionLoadRequest)</pre>  |  <pre>enhancedClient.transactGetItems(transactGetItemsRequest) </pre>  | 
|  Ruft die Anzahl der übereinstimmenden Elemente einer Abfrage ab **DynamoDB-Betrieb**: mit `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>  | 
|  Ermittelt die Anzahl der übereinstimmenden Elemente eines Scans **DynamoDB-Betrieb**: mit `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>  | 
|  Erstellen Sie eine Tabelle in DynamoDB, die der POJO-Klasse entspricht **DynamoDB-Betrieb:** `CreateTable`  |  <pre>mapper.generateCreateTableRequest(Customer.class)</pre> Die vorherige Anweisung generiert eine Low-Level-Anforderung zur Tabellenerstellung; Benutzer müssen den DynamoDB-Client aufrufen`createTable`.  |  <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>  | 
|  Führen Sie einen parallel Scan in DynamoDB durch **DynamoDB-Operation:** `Scan` mit `Segment` und Parametern `TotalSegments`  |  <pre>mapper.parallelScan(Customer.class, <br />                    scanExpression, <br />                    numTotalSegments)</pre>  |  Benutzer müssen die Worker-Threads verwalten und jedes Segment aufrufen`scan`: <pre>table.scan(r -> r.segment(0).totalSegments(5))</pre>  | 
|  Integrieren Sie Amazon S3 mit DynamoDB, um intelligente S3-Links zu speichern  |  <pre>mapper.createS3Link(bucket, key)<br />mapper.getS3ClientCache()</pre>  |  Wird nicht unterstützt, da es Amazon S3 und DynamoDB verbindet.  | 

## Ordnen Sie Klassen und Eigenschaften zu
<a name="dynamodb-mapping-schemas"></a>

Sowohl in V1 als auch in V2 ordnen Sie Klassen Tabellen mithilfe von Anmerkungen im Bean-Stil zu. V2 bietet auch [andere Möglichkeiten, Schemas für bestimmte Anwendungsfälle zu definieren](ddb-en-client-adv-features.md#ddb-en-client-adv-features-schm-overview), z. B. die Arbeit mit unveränderlichen Klassen.

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

Die folgende Tabelle zeigt die entsprechenden Bean-Annotationen für einen bestimmten Anwendungsfall, die in V1 und V2 verwendet werden. Ein `Customer` Klassenszenario wird verwendet, um Parameter zu veranschaulichen.

Anmerkungen — ebenso wie Klassen und Aufzählungen — in V2 folgen der Camel-Case-Konvention und verwenden '', nicht 'DynamoDB'. DynamoDb


| Anwendungsfall | V1 | V2 | 
| --- | --- | --- | 
| Klasse der Tabelle zuordnen |  <pre>@DynamoDBTable (tableName ="CustomerTable")</pre>  | <pre>@DynamoDbBean<br />@DynamoDbBean(converterProviders = {...})</pre>Der Tabellenname wird beim Aufrufen der DynamoDbEnhancedClient\$1table() Methode definiert. | 
| Benennen Sie ein Klassenmitglied als Tabellenattribut  |  <pre>@DynamoDBAttribute(attributeName = "customerName")</pre>  |  <pre>@DynamoDbAttribute("customerName") </pre>  | 
| Die Benennung eines Klassenmitglieds ist ein Schlüssel hash/partition  |  <pre>@DynamoDBHashKey </pre>  |  <pre>@DynamoDbPartitionKey</pre>  | 
| Die Benennung eines Klassenmitglieds ist ein Schlüssel range/sort  |  <pre>@DynamoDBRangeKey </pre>  |  <pre>@DynamoDbSortKey </pre>  | 
| Ein Klassenmitglied als sekundären Index-Hash-/Partitionsschlüssel bezeichnen |  <pre>@DynamoDBIndexHashKey </pre>  |  <pre>@DynamoDbSecondaryPartitionKey </pre>  | 
| Ein Klassenmitglied als sekundären Indexbereich/Sortierschlüssel bezeichnen |  <pre>@DynamoDBIndexRangeKey </pre>  |  <pre>@DynamoDbSecondarySortKey </pre>  | 
| Ignorieren Sie dieses Klassenmitglied bei der Zuordnung zu einer Tabelle |  <pre>@DynamoDBIgnore </pre>  |  <pre>@DynamoDbIgnore</pre>  | 
| Benennen Sie ein Klassenmitglied als automatisch generiertes UUID-Schlüsselattribut |  <pre>@DynamoDBAutoGeneratedKey</pre>  |  <pre>@DynamoDbAutoGeneratedUuid </pre> Die Erweiterung, die dies bereitstellt, wird standardmäßig nicht geladen. Sie müssen die Erweiterung zu Client Builder hinzufügen.  | 
| Kennzeichnen Sie ein Klassenmitglied als automatisch generiertes Zeitstempelattribut |  <pre>@DynamoDBAutoGeneratedTimestamp</pre>  |  <pre>@DynamoDbAutoGeneratedTimestampAttribute</pre> Die Erweiterung, die dies bereitstellt, wird standardmäßig nicht geladen. Sie müssen die Erweiterung zu Client Builder hinzufügen.  | 
| Kennzeichnen Sie ein Klassenmitglied als automatisch inkrementiertes Versionsattribut |  <pre>@DynamoDBVersionAttribute</pre>  |  <pre>@DynamoDbVersionAttribute</pre> Die Erweiterung, die dies bereitstellt, wird automatisch geladen.  | 
| Weisen Sie einem Klassenmitglied zu, für das eine benutzerdefinierte Konvertierung erforderlich ist |  <pre>@DynamoDBTypeConverted</pre>  |  <pre>@DynamoDbConvertedBy</pre>  | 
| Legen Sie ein Klassenmitglied fest, das mit einem anderen Attributtyp gespeichert werden soll |  <pre>@DynamoDBTyped(<DynamoDBAttributeType>)</pre>  |  Verwenden Sie eine `AttributeConverter` Implementierung. V2 bietet viele integrierte Konverter für gängige Java-Typen. Sie können auch Ihr eigenes benutzerdefiniertes `AttributeConverter` oder implementieren`AttributeConverterProvider`. Siehe [Steuern Sie die Attributkonvertierung](ddb-en-client-adv-features-conversion.md) in diesem Handbuch.  | 
| Bestimmen Sie eine Klasse, die in ein DynamoDB-Dokument (Dokument im JSON-Stil) oder Unterdokument serialisiert werden kann  |  <pre>@DynamoDBDocument</pre>  | Verwenden Sie die erweiterte Dokument-API. Weitere Informationen finden Sie in den folgenden Ressourcen:[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/de_de/sdk-for-java/latest/developer-guide/dynamodb-mapping-api-changes.html) | 

### V2 zusätzliche Anmerkungen
<a name="dynamodb-mapping-schemas-annos-v2-addnl"></a>


| Anwendungsfall | V1 | V2 | 
| --- | --- | --- | 
| Bestimmen Sie ein Klassenmitglied, das nicht als NULL-Attribut gespeichert werden soll, wenn der Java-Wert Null ist | – |  <pre>@DynamoDbIgnoreNulls</pre>  | 
| Bestimmen Sie ein Klassenmitglied als leeres Objekt, wenn alle Attribute Null sind | – |  <pre>@DynamoDbPreserveEmptyObject</pre>  | 
| Legen Sie eine spezielle Aktualisierungsaktion für ein Klassenmitglied fest | – |  <pre>@DynamoDbUpdateBehavior</pre>  | 
| Bestimmen Sie eine unveränderliche Klasse | – |  <pre>@DynamoDbImmutable</pre>  | 
| Kennzeichnen Sie ein Klassenmitglied als automatisch inkrementiertes Zählerattribut | – |  <pre>@DynamoDbAtomicCounter</pre> Die Erweiterung, die diese Funktionalität bereitstellt, wird automatisch geladen.  | 

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

In V1 steuern Sie im Allgemeinen bestimmte Verhaltensweisen, indem Sie eine Instanz von `DynamoDBMapperConfig` verwenden. Sie können das Konfigurationsobjekt entweder angeben, wenn Sie den Mapper erstellen oder wenn Sie eine Anfrage stellen. In V2 ist die Konfiguration spezifisch für das Anforderungsobjekt für den Vorgang.


| Anwendungsfall | V1 | Standard in V1 | V2 | 
| --- | --- | --- | --- | 
|  |  <pre>DynamoDBMapperConfig.builder()</pre>  |  |  | 
| Strategie zur load/write Wiederholung von Batch |  <pre>  .withBatchLoadRetryStrategy(loadRetryStrategy)</pre> <pre>  .withBatchWriteRetryStrategy(writeRetryStrategy)</pre>  | Fehlgeschlagene Artikel erneut versuchen | Konfigurieren Sie die Wiederholungsstrategie für das Basisprodukt. DynamoDBClient Weitere Informationen finden Sie [Konfigurieren Sie das Wiederholungsverhalten in der AWS SDK for Java 2.x](retry-strategy.md) in diesem Handbuch. | 
| Konsistente Lesevorgänge |  <pre>  .withConsistentReads(CONSISTENT)</pre>  | EVENTUAL | Standardmäßig ist der Wert für konsistente Lesevorgänge für Lesevorgänge falsch. Überschreiben .consistentRead(true) Sie mit im Anforderungsobjekt. | 
| Konvertierungsschema mit Gruppen von Marshallern/Unmarshallern |  <pre>  .withConversionSchema(conversionSchema)</pre> Statische Implementierungen bieten Abwärtskompatibilität mit älteren Versionen.  | V2\$1COMPATIBLE | Nicht zutreffend. Dies ist ein veraltetes Feature, das sich darauf bezieht, wie die frühesten Versionen von DynamoDB (V1) Datentypen gespeichert haben. Dieses Verhalten wird im erweiterten Client nicht beibehalten. Ein Beispiel für ein Verhalten in DynamoDB V1 ist das Speichern von Booleschen Werten als Zahl statt als Boolean. | 
| Tabellennamen |  <pre>  .withObjectTableNameResolver()<br />  .withTableNameOverride() <br />  .withTableNameResolver()</pre> Statische Implementierungen bieten Abwärtskompatibilität mit älteren Versionen  | verwende Anmerkungen oder Vermutungen aus der Klasse |  Der Tabellenname wird beim Aufrufen der `DynamoDbEnhancedClient#table()` Methode definiert.  | 
| Strategie beim Laden der Seitennummerierung |  <pre>  .withPaginationLoadingStrategy(strategy)</pre>  Die Optionen sind: LAZY\$1`LOADING`, oder `EAGER_LOADING` `ITERATION_ONLY`  | LAZY\$1LOADING |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/de_de/sdk-for-java/latest/developer-guide/dynamodb-mapping-api-changes.html)  | 
| Erfassung von Metriken anfordern |  <pre>  .withRequestMetricCollector(collector)</pre>  | null | Verwenden Sie metricPublisher() inClientOverrideConfiguration, wenn Sie den standardmäßigen DynamoDB-Client erstellen.  | 
| Verhalten speichern |  <pre>  .withSaveBehavior(SaveBehavior.CLOBBER) </pre> Die Optionen sind `UPDATE``CLOBBER`,`PUT`,`APPEND_SET`, oder`UPDATE_SKIP_NULL_ATTRIBUTES`.  | UPDATE |  In V2 rufen Sie `putItem()` oder `updateItem()` explizit auf. `CLOBBER or PUT`: Die entsprechende Aktion in Version 2 ist das Aufrufen`putItem()`. Es gibt keine spezifische `CLOBBER` Konfiguration. `UPDATE`: Entspricht `updateItem()` `UPDATE_SKIP_NULL_ATTRIBUTES`: Entspricht`updateItem()`. Steuern Sie das Aktualisierungsverhalten mit der Anforderungseinstellung `ignoreNulls` und der Annotation/dem Tag`DynamoDbUpdateBehavior`. `APPEND_SET`: Nicht unterstützt  | 
| Geben Sie Converter Factory ein |  <pre>  .withTypeConverterFactory(typeConverterFactory) </pre>  | Wandler vom Typ Standard |  Auf die Bohne legen, indem Sie <pre>@DynamoDbBean(converterProviders = {ConverterProvider.class, <br />        DefaultAttributeConverterProvider.class})</pre>  | 

### Konfiguration pro Vorgang
<a name="dynamodb-mapping-configuration-per-op"></a>

In Version 1 sind einige Operationen, wie z. B.`query()`, über ein Ausdrucksobjekt, das der Operation übergeben wird, in hohem Maße konfigurierbar. Beispiel:

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

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

In V2 verwenden Sie kein Konfigurationsobjekt, sondern legen Parameter für das Anforderungsobjekt mithilfe eines Builders fest. Beispiel:

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

customerTable.query(emailBw);
```

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

In V2 werden Bedingungs- und Filterausdrücke mithilfe eines `Expression` Objekts ausgedrückt, das die Bedingung und die Zuordnung von Namen und Filtern kapselt. 


| Anwendungsfall | Operationen | V1 | V2 | 
| --- | --- | --- | --- | 
| Erwartete Attributbedingungen | speichern (), löschen (), abfragen (), scannen () |  <pre>new DynamoDBSaveExpression()<br />  .withExpected(Collections.singletonMap(<br />      "otherAttribute", new ExpectedAttributeValue(false)))<br />  .withConditionalOperator(ConditionalOperator.AND);</pre>  | Veraltet; stattdessen verwendenConditionExpression. | 
| Bedingungsausdruck | löschen () |  <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>  | 
| Filterausdruck | abfragen (), scannen () |  <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>  | 
| Bedingungsausdruck für die Abfrage | abfrage () |  <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>  | 

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

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

In V2 bietet das SDK eine Reihe von Standardkonvertern für alle gängigen Typen. Sie können Typkonverter sowohl auf der Gesamtanbieterebene als auch für ein einzelnes Attribut ändern. Eine Liste der verfügbaren Konverter finden Sie in der [AttributeConverter](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/enhanced/dynamodb/AttributeConverter.html)API-Referenz.

### Legen Sie einen benutzerdefinierten Konverter für ein Attribut fest
<a name="dynamodb-mapping-type-conv-anno"></a>

In V1 können Sie eine Getter-Methode mit annotieren, `@DynamoDBTypeConverted` um die Klasse anzugeben, die zwischen dem Java-Attributtyp und einem DynamoDB-Attributtyp konvertiert. Beispielsweise kann eine, `CurrencyFormatConverter` die zwischen einem `Currency` Java-Typ und einem DynamoDB-String konvertiert, angewendet werden, wie im folgenden Codeausschnitt gezeigt.

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

Das V2-Äquivalent des vorherigen Snippets ist unten dargestellt.

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

**Anmerkung**  
In V1 können Sie die Anmerkung auf das Attribut selbst, einen Typ oder eine benutzerdefinierte Anmerkung anwenden. V2 unterstützt das Anwenden der Anmerkung nur auf den Getter.

### Fügen Sie einen Typkonverter, eine Fabrik oder einen Anbieter hinzu
<a name="dynamodb-mapping-type-conv-factory"></a>

In V1 können Sie Ihren eigenen Satz von Typkonvertern bereitstellen oder die Typen, die Ihnen wichtig sind, überschreiben, indem Sie der Konfiguration eine Typkonverter-Factory hinzufügen. Die Typkonverter-Factory wird erweitert`DynamoDBTypeConverterFactory`, und Überschreibungen werden vorgenommen, indem ein Verweis auf den Standardsatz abgerufen und dieser erweitert wird. Der folgende Ausschnitt zeigt, wie das geht.

```
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 bietet durch die Anmerkung ähnliche Funktionen. `@DynamoDbBean` Sie können ein einzelnes `AttributeConverterProvider` oder eine Kette von bestellten `AttributeConverterProvider` s angeben. Beachten Sie, dass Sie, wenn Sie Ihre eigene Kette von Anbietern für Attributkonverter angeben, den Standardkonverter-Anbieter überschreiben und ihn in die Kette aufnehmen müssen, um die zugehörigen Attributkonverter verwenden zu können. 

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

Der Abschnitt zur [Attributkonvertierung](ddb-en-client-adv-features-conversion.md#ddb-en-client-adv-features-conversion-example) in diesem Handbuch enthält ein vollständiges Beispiel für V2.

# Unterschiede im Umgang mit Zeichenketten zwischen Version 1 und Version 2 des SDK for Java
<a name="dynamodb-migration-string-handling"></a>

V1 und V2 behandeln leere Zeichenketten unterschiedlich, wenn Daten an DynamoDB gesendet werden:
+ **V1**: Konvertiert leere Zeichenketten vor dem Senden an DynamoDB in Nullwerte (was zu keinem Attribut führt)
+ **V2**: Sendet leere Zeichenketten als tatsächliche leere Zeichenkettenwerte an DynamoDB

**Wichtig**  
Wenn Sie nach der Migration zu V2 keine leeren Zeichenketten in DynamoDB speichern möchten, müssen Sie benutzerdefinierte Konverter implementieren. Ohne benutzerdefinierte Konverter speichert V2 leere Zeichenfolgen als tatsächliche leere Zeichenkettenattribute in Ihren DynamoDB-Elementen, was sich von dem Verhalten von V1 unterscheidet, diese Attribute vollständig wegzulassen.

**Example benutzerdefinierter Konverter für V2, der ein leeres Zeichenkettenattribut in Null umwandelt**  

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



# Optimistische Sperrunterschiede zwischen Version 1 und Version 2 des SDK for Java
<a name="dynamodb-migrate-optimstic-locking"></a>

Sowohl V1 als auch V2 implementieren optimistisches Sperren mit einer Attributanmerkung, die eine Eigenschaft in Ihrer Bean-Klasse markiert, um die Versionsnummer zu speichern.


**Unterschiede im optimistischen Sperrverhalten**  

|  | V1 | V2 | 
| --- | --- | --- | 
| Anmerkung zur Bean-Klasse | @DynamoDBVersionAttribute | @DynamoDbVersionAttribute(Beachten Sie, dass V2 ein kleingeschriebenes „b“ verwendet) | 
| Erstes Speichern | Das Versionsnummer-Attribut ist auf 1 gesetzt. |  Der Startwert für das auf festgelegte Versionsattribut`@DynamoDbVersionAttribute(startAt = X)`. Der Standardwert ist 0.  | 
| Aktualisierung | Das Versionsnummernattribut wird um 1 erhöht, wenn die bedingte Prüfung sicherstellt, dass die Versionsnummer des zu aktualisierenden Objekts mit der Nummer in der Datenbank übereinstimmt. |  Das Versionsnummernattribut wird erhöht, wenn bei der bedingten Überprüfung überprüft wird, ob die Versionsnummer des zu aktualisierenden Objekts mit der Nummer in der Datenbank übereinstimmt. Das Versionsnummernattribut wird um die mit festgelegte `incrementBy` Option erhöht. `@DynamoDbVersionAttribute(incrementBy = X)` Der Standardwert ist 1.  | 
| Delete | DynamoDBMapperfügt eine bedingte Überprüfung hinzu, ob die Versionsnummer des gelöschten Objekts mit der Versionsnummer in der Datenbank übereinstimmt. |  V2 fügt nicht automatisch Bedingungen für die Löschvorgänge hinzu. Sie müssen Bedingungsausdrücke manuell hinzufügen, wenn Sie das Löschverhalten steuern möchten. Im folgenden Beispiel `recordVersion` ist das Versionsattribut der Bean dargestellt. <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>  | 
| Transaktionales Schreiben mit einer Zustandsprüfung | Sie können eine Bean-Klasse, die mit einer Anmerkung versehen ist, nicht @DynamoDBVersionAttribute in einer Methode verwenden. addConditionCheck | Sie können eine Bean-Klasse mit der @DynamoDbVersionAttribute Anmerkung in einer addConditionCheck Builder-Methode für eine transactWriteItems Anfrage verwenden. | 
| Deaktivieren | Deaktivieren Sie optimistisches Sperren, indem Sie den  DynamoDBMapperConfig.SaveBehavior Aufzählungswert von UPDATE bis CLOBBER ändern. |  Verwenden Sie die `@DynamoDbVersionAttribute` Anmerkung nicht.  | 

# Fluent Setter: Unterschiede zwischen Version 1 und Version 2 des SDK for Java
<a name="dynamodb-migrate-fluent-setters"></a>

Sie können es POJOs mit Fluent-Settern in der DynamoDB-Mapping-API für V1 und mit V2 seit Version 2.30.29 verwenden. 

Das folgende POJO gibt beispielsweise eine Instanz aus der Methode zurück: `Customer` `setName`

```
// V1

@DynamoDBTable(tableName ="Customer")
public class Customer{
  private String name;
  // Other attributes and methods not shown.
  public Customer setName(String name){
     this.name = name;
     return this;
  }
}
```

Wenn Sie jedoch eine Version von V2 vor 2.30.29 verwenden, wird eine `Customer` Instanz mit dem Wert von `setName` zurückgegeben. `name` `null`

```
// V2 prior to version 2.30.29.

@DynamoDbBean
public class Customer{
  private String name;
  // Other attributes and methods not shown.
  public Customer setName(String name){ 
     this.name = name;
     return this;  // Bug: returns this instance with a `name` value of `null`.
  }
}
```

```
// Available in V2 since version 2.30.29.

@DynamoDbBean
public class Customer{
  private String name;
  // Other attributes and methods not shown.
  public Customer setName(String name){ 
     this.name = name;
     return this;  // Returns this instance for method chaining with the `name` value set.
  }
}
```

# Dokumentieren Sie die API-Unterschiede zwischen Version 1 und Version 2 von AWS SDK für Java
<a name="dynamodb-mapping-document-api"></a>

Die Dokument-API unterstützt die Arbeit mit Dokumenten im JSON-Stil als einzelne Elemente in einer DynamoDB-Tabelle. Die V1-Dokument-API hat eine entsprechende API in V2, aber anstatt wie in V1 einen separaten Client für die Dokument-API zu verwenden, integriert V2 Dokument-API-Funktionen in den erweiterten DynamoDB-Client. 

In V1 stellt die [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)Klasse einen unstrukturierten Datensatz aus einer DynamoDB-Tabelle dar. In V2 wird ein unstrukturierter Datensatz durch eine Instanz der Klasse dargestellt. [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) Beachten Sie, dass Primärschlüssel im Tabellenschema für V2 und im Element selbst in V1 definiert sind.

In der folgenden Tabelle werden die Unterschiede zwischen den Dokumenten APIs in V1 und V2 verglichen.


| Anwendungsfall | V1 | V2 | 
| --- |--- |--- |
| Erstellen Sie einen Dokumentenclient |  <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>  | 
| Verweisen Sie auf eine Tabelle |  <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** | 
| --- |
| Element einfügen |  <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>  | 
| Element abrufen |  <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** | 
| --- |
| Konvertiert eine JSON-Struktur, um sie mit der Document API zu verwenden |  <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>  | 
| Geben Sie JSON ein |  <pre>documentTable.putItem(item)</pre>  |  <pre>documentTable.putItem(document);</pre>  | 
| Lesen Sie 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>  | 

## API-Referenz und Anleitungen für das Dokument APIs
<a name="dynamodb-mapping-document-api-ref"></a>


|  | V1 | V2 | 
| --- | --- | --- | 
| API-Referenz | [API-Referenz](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/document/package-summary.html) | [API-Referenz](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/enhanced/dynamodb/document/package-summary.html) | 
| Leitfaden zur Dokumentation | [Entwicklerhandbuch für Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/JavaDocumentAPIItemCRUD.html) | [Verbesserte Dokument-API](ddb-en-client-doc-api.md) (dieser Leitfaden) | 

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

Die in Version 1 verfügbare Expression Specification (Xspec) -API, mit der Ausdrücke für dokumentorientierte Daten erstellt werden können, ist in Version 2 nicht verfügbar. V2 verwendet die Expression API, die sowohl mit dokumentenorientierten Daten als auch mit zugewiesenen Daten funktioniert. object-to-item


****  

|  | V1 | V2 | 
| --- | --- | --- | 
| API-Name | API für Ausdrucksspezifikationen (Xspec) | Ausdrucks-API | 
| Funktioniert mit | [Methoden der [Document-API-Tabellenklasse](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/document/Table.html) wie [updateItem und scan](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-)](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/document/Table.html#scan-com.amazonaws.services.dynamodbv2.xspec.ScanExpressionSpec-) |  Beide Versionen APIs von DynamoDB Enhanced Client: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/de_de/sdk-for-java/latest/developer-guide/ddb-v1-xspec-migrate.html) Für beide Typen von APIs, nachdem Sie eine [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)Instanz erworben haben: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/de_de/sdk-for-java/latest/developer-guide/ddb-v1-xspec-migrate.html) Sie verwenden Ausdrücke in `DynamoDbTable` Methoden, wenn Sie Anforderungsobjekte erstellen. Zum Beispiel in der `filterExpression` Methode der [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)  | 
| Ressourcen |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/de_de/sdk-for-java/latest/developer-guide/ddb-v1-xspec-migrate.html)  | [Informationen zu Ausdrücken](ddb-en-client-expressions.md) in diesem Java-Entwicklerhandbuch | 

# Migration der Verschlüsselungsbibliothek
<a name="ddb-encryption-lib-migrate"></a>

Informationen zur Migration der Verschlüsselungsbibliothek für DynamoDB, damit sie mit Version 2 des Java SDK funktioniert, finden Sie im [Amazon DynamoDB](https://docs.aws.amazon.com/database-encryption-sdk/latest/devguide/ddb-java-migrate.html) Encryption Client Developer Guide.

# Änderungen beim automatischen Batching von Amazon SQS SQS-Anfragen von Version 1 zu Version 2
<a name="migration-sqs-auto-batching"></a>

In diesem Thema werden die Änderungen beim automatischen Batching von Anfragen für Amazon SQS zwischen Version 1 und Version 2 von beschrieben. AWS SDK für Java

## Änderungen auf hoher Ebene
<a name="migration-sqs-auto-batching-high-level-changes"></a>

 AWS SDK für Java 1.x führt die clientseitige Pufferung mithilfe einer separaten `[AmazonSQSBufferedAsyncClient](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/sqs/buffered/AmazonSQSBufferedAsyncClient.html)` Klasse durch, die eine explizite Initialisierung für das Batching von Anfragen erfordert. 

Das AWS SDK for Java 2.x vereinfacht und erweitert die Pufferfunktionalität mit dem. `[SqsAsyncBatchManager](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/sqs/batchmanager/SqsAsyncBatchManager.html)` Die Implementierung dieser Schnittstelle bietet automatische Batchfunktionen für Anfragen, die direkt in den Standard integriert sind. `[SqsAsyncClient](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/sqs/SqsAsyncClient.html)` Weitere Informationen zu Version 2 finden Sie unter dem [Verwenden Sie die automatische Batchverarbeitung von Anfragen für Amazon SQS mit dem AWS SDK for Java 2.x](sqs-auto-batch.md) Thema in diesem Handbuch. `SqsAsyncBatchManager`


| Änderungen | v1 |   v2 | 
| --- | --- | --- | 
|    Maven-Abhängigkeiten  |  <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>  | 
| Namen von Paketen | com.amazonaws.services.sqs.buffered | software.amazon.awssdk.services.sqs.batchmanager | 
| Klassennamen |  `[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 [Letzte Version](https://central.sonatype.com/artifact/com.amazonaws/aws-java-sdk-bom). 2 [Letzte Version](https://central.sonatype.com/artifact/software.amazon.awssdk/bom).

## Automatisches Batching von SQS-Anfragen verwenden
<a name="migration-sqs-auto-batching-using"></a>


| Änderungen | v1 |   v2 | 
| --- | --- | --- | 
| Erstellen Sie einen Batch-Manager |  <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>  | 
| Erstellen Sie einen Batch-Manager mit benutzerdefinierter Konfiguration |  <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>  | 
| Senden Sie Nachrichten |  <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>  | 
| Nachrichten löschen |  <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>  | 
| Sichtbarkeit von Nachrichten ändern |  <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>  | 
| Empfangen Sie Nachrichten |  <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>  | 

## Unterschiede beim asynchronen Rückgabetyp
<a name="migration-sqs-auto-batching-asyc-return-type"></a>


| Änderungen | v1 |   v2 | 
| --- | --- | --- | 
| Rückgabetyp | Future<ResultType> | CompletableFuture<ResponseType> | 
| Rückruf-Mechanismus | Erfordert eine AsyncHandler mit separaten onSuccess Methoden onError | Vom JDK CompletableFuture APIs bereitgestellte Verwendungen, wiewhenComplete(), thenCompose() thenApply() | 
| Ausnahmeverarbeitung | Verwendet Methode AsyncHandler\$1onError() | Verwendungen, die vom JDK CompletableFuture APIs bereitgestellt werden, wieexceptionally(),handle(), oder whenComplete() | 
| Abbruch | Grundlegende Unterstützung durch Future.cancel() | Durch die Kündigung eines übergeordneten Unternehmens CompletableFuture werden automatisch alle abhängigen Futures in der Kette storniert | 

## Asynchrone Fertigstellung, Behandlung von Unterschieden
<a name="migration-sqs-auto-batching-asyc-completion-handling"></a>


| Änderungen | v1 |   v2 | 
| --- | --- | --- | 
| Implementierung des Response-Handlers |  <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>  | 

## Wichtige Konfigurationsparameter
<a name="migration-sqs-auto-batching-params"></a>


****  

| Parameter | v1 |   v2 | 
| --- | --- | --- | 
| Maximale Stapelgröße | maxBatchSize(standardmäßig 10 Anfragen pro Stapel) | maxBatchSize(standardmäßig 10 Anfragen pro Stapel) | 
| Wartezeit für Batch | maxBatchOpenMs(Standard 200 ms) | sendRequestFrequency(Standard 200 ms) | 
| Timeout für Sichtbarkeit | visibilityTimeoutSeconds(-1 für die Standardeinstellung in der Warteschlange) | receiveMessageVisibilityTimeout(Standardeinstellung für die Warteschlange) | 
| Minimale Wartezeit | longPollWaitTimeoutSeconds(20s wann longPoll ist wahr) | receiveMessageMinWaitDuration(Standard 50 ms) | 
| Nachrichtenattribute | Stellen Sie ein mit ReceiveMessageRequest | receiveMessageAttributeNames(standardmäßig keine) | 
| Systemattribute | Stellen Sie ein mit ReceiveMessageRequest | receiveMessageSystemAttributeNames(standardmäßig keine) | 
| Lange Umfragen | longPoll(Die Standardeinstellung ist „true“) | Wird nicht unterstützt, um zu verhindern, dass offene Verbindungen warten, bis der Server die Nachrichten sendet | 
| Maximale Wartezeit für lange Abfragen | longPollWaitTimeoutSeconds(Standard 20s) | Wird nicht unterstützt, um zu verhindern, dass offene Verbindungen warten, bis der Server die Nachrichten sendet | 
| Maximale Anzahl von vorab abgerufenen Empfangsstapeln, die clientseitig gespeichert werden | maxDoneReceiveBatches(10 Stapel) | Wird nicht unterstützt, da es intern verwaltet wird | 
| Maximale Anzahl aktiver ausgehender Batches, die gleichzeitig verarbeitet werden | maxInflightOutboundBatches(standardmäßig 5 Batches) | Wird nicht unterstützt, da es intern verarbeitet wird | 
| Maximale Anzahl aktiver Empfangsstapel, die gleichzeitig verarbeitet werden | maxInflightReceiveBatches(standardmäßig 10 Batches) | Wird nicht unterstützt, da es intern verarbeitet wird | 