View a markdown version of this page

Différences du client S3 entre la version 1 et la version 2 du AWS SDK pour Java - AWS SDK for Java 2.x

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Différences du client S3 entre la version 1 et la version 2 du AWS SDK pour Java

Dans cette rubrique, les différences entre les clients S3 des versions 1 et 2 du SDK for Java sont organisées en fonction de la manière dont l'outil de migration peut automatiser la migration. L'outil prend en charge la migration de la plupart des méthodes de la version 1 à la version 2, mais certaines méthodes nécessitent une migration manuelle. Outre les méthodes client S3, certaines classes S3 V1 n'ont pas d'équivalent V2 direct, ce qui vous oblige à les migrer manuellement.

Exemple de méthodes V1 prises en charge par l'outil de migration

L'outil de migration migre automatiquement la plupart des méthodes de la V1 à la V2. Les getObject méthodes putObject et en sont deux exemples.

PUTOBJECT

// 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!"));

Obtenir un objet

// 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"));
Note

Lors de la migration depuis le SDK for Java 1.x, mettez à jour manuellement le code utilisé pour décoder une réponse GZIPInputStream GZIP concaténée. L'outil de migration ne met pas automatiquement à jour ce code. Pour plus de détails et des exemples, voir Migrer la gestion des réponses GZIP concaténées.

Ajouter un objet à un fichier

// SDK V1 // V1 automatically creates parent directories if they don't exist. ObjectMetadata metadata = s3Client.getObject( new GetObjectRequest("amzn-s3-demo-bucket", "my-key"), new File("/path/to/parent/dir/my-file.txt")); // SDK V2 // V2 does NOT auto-create parent directories. Ensure they exist before calling getObject. Files.createDirectories(Paths.get("/path/to/parent/dir")); s3Client.getObject( req -> req.bucket("amzn-s3-demo-bucket").key("my-key"), ResponseTransformer.toFile(Paths.get("/path/to/parent/dir/my-file.txt")));
Important

Contrairement au SDK V1, le SDK V2 ResponseTransformer.toFile() ne crée pas automatiquement de répertoires parents. Si le répertoire parent n'existe pas, le SDK renvoie unNoSuchFileException. Appelez Files.createDirectories() avant le téléchargement si les répertoires parents n'existent peut-être pas.

Méthodes V1 nécessitant une migration manuelle

Vous devez migrer manuellement les méthodes client V1 S3 suivantes. Lorsque vous utilisez l'outil de migration, un commentaire s'affiche dans le fichier Java de sortie V2 qui vous dirige vers cette rubrique.

GetObject de V1 utilisant les versions V1 S3ObjectIdà V2 GetObjectRequest.builder()

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

GetTag () de V1 utilisant les versions V1 ObjectMetadataà V2 () GetObjectResponse.eTag

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

La liste de V1 et NextBatchOfObjects ListObjectSv2Paginator de la V2

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

De la liste de la V1 NextBatchOfVersions à la liste de la V2 ObjectVersionsPaginator

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

sélectionner ObjectContent

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

V1 est défini BucketAcl sur la méthode acl de V2 on PutBucketAclRequest.builder()

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

V1 est défini ObjectAcl sur la méthode acl de V2 on PutObjectAclRequest.builder()

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

Les V1 MultipartUploadinitient les V2 créent MultipartUpload

Exemple de migration

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

Différences d'implémentation

La valeur Content-Type d'en-tête par défaut pour les méthodes suivantes est différente, comme indiqué dans le tableau suivant.

Version de SDK Méthode Content-TypeValeur par défaut
version 1 initiateMultipartUpload application/octet-stream
version 2 createMultipartUpload binary/octet-stream

Méthode setRegion de V1 par rapport à la méthode region de V2 sur le générateur de clients

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

Set de V1 S3ClientOptions (S3ClientOptions ClientOptions)

Au lieu d'utiliser un seul S3ClientOptions objet avec la setS3ClientOptions méthode, la V2 fournit des méthodes sur le générateur de clients pour définir les options.

V1 est BucketLoggingConfigurationréglé sur V2 BucketLogging

// SDK V1 AmazonS3 s3ClientV1 = AmazonS3ClientBuilder.standard() .withRegion(Regions.US_WEST_2) .build(); BucketLoggingConfiguration loggingConfig = new BucketLoggingConfiguration(); loggingConfig.setDestinationBucketName("log-bucket"); SetBucketLoggingConfigurationRequest request = new SetBucketLoggingConfigurationRequest( "amzn-s3-demo-source-bucket", loggingConfig ); s3ClientV1.setBucketLoggingConfiguration(request); // SDK V2 // In V2, V1's 'BucketLoggingConfiguration' is replaced by 'BucketLoggingStatus' // and 'LoggingEnabled'. S3Client s3ClientV2 = S3Client.builder() .region(Region.US_WEST_2) .build(); LoggingEnabled loggingEnabled = LoggingEnabled.builder() .targetBucket("log-bucket") .build(); BucketLoggingStatus loggingStatus = BucketLoggingStatus.builder() .loggingEnabled(loggingEnabled) .build(); PutBucketLoggingRequest request = PutBucketLoggingRequest.builder() .bucket("amzn-s3-demo-source-bucket") .bucketLoggingStatus(loggingStatus) .build(); s3ClientV2.putBucketLogging(request);

V1 est BucketLifecycleConfigurationréglé sur V2 BucketLifecycleConfiguration

// SDK V1 BucketLifecycleConfiguration.Rule rule = new BucketLifecycleConfiguration.Rule() .withId("Archive and Delete Rule") .withPrefix("documents/") .withStatus(BucketLifecycleConfiguration.ENABLED) .withTransitions(Arrays.asList( new Transition() .withDays(30) .withStorageClass(StorageClass.StandardInfrequentAccess.toString()), new Transition() .withDays(90) .withStorageClass(StorageClass.Glacier.toString()) )) .withExpirationInDays(365); BucketLifecycleConfiguration configuration = new BucketLifecycleConfiguration() .withRules(Arrays.asList(rule)); s3ClientV1.setBucketLifecycleConfiguration("amzn-s3-demo-bucket", configuration); // SDK V2 LifecycleRule rule = LifecycleRule.builder() .id("Archive and Delete Rule") .filter(LifecycleRuleFilter.builder() .prefix("documents/") .build()) .status(ExpirationStatus.ENABLED) .transitions(Arrays.asList( Transition.builder() .days(30) .storageClass(TransitionStorageClass.STANDARD_IA) .build(), Transition.builder() .days(90) .storageClass(TransitionStorageClass.GLACIER) .build() )) .expiration(LifecycleExpiration.builder() .days(365) .build()) .build(); PutBucketLifecycleConfigurationRequest request = PutBucketLifecycleConfigurationRequest.builder() .bucket("amzn-s3-demo-bucket") .lifecycleConfiguration(BucketLifecycleConfiguration.builder() .rules(rule) .build()) .build(); s3ClientV2.putBucketLifecycleConfiguration(request);

V1 est BucketTaggingConfigurationréglé sur V2 BucketTagging

// SDK V1 List<TagSet> tagsets = new ArrayList<>(); TagSet tagSet = new TagSet(); tagSet.setTag("key1", "value1"); tagSet.setTag("key2", "value2"); tagsets.add(tagSet); BucketTaggingConfiguration bucketTaggingConfiguration = new BucketTaggingConfiguration(); bucketTaggingConfiguration.setTagSets(tagsets); SetBucketTaggingConfigurationRequest request = new SetBucketTaggingConfigurationRequest( "amzn-s3-demo-bucket", bucketTaggingConfiguration ); s3ClientV1.setBucketTaggingConfiguration(request); // SDK V2 Tagging tagging = Tagging.builder() .tagSet(Arrays.asList( Tag.builder() .key("key1") .value("value1") .build(), Tag.builder() .key("key2") .value("value2") .build() )) .build(); PutBucketTaggingRequest request = PutBucketTaggingRequest.builder() .bucket("amzn-s3-demo-bucket") .tagging(tagging) .build(); s3ClientV2.putBucketTagging(request);

Classes V1 nécessitant une migration manuelle

V1 AccessControlListà V2 AccessControlPolicy

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

L'CannedAccessControlListénumération de V1 vers les énumérations BucketCannedACL et ObjectCannedACL de V2

// SDK V1 // In V1, 'CannedAccessControlList' is an enumeration of predefined ACLs. AmazonS3 s3ClientV1 = AmazonS3ClientBuilder.standard().build(); // Creating a bucket. s3ClientV1.setBucketAcl("bucket-name", CannedAccessControlList.PublicRead); // Creating an object. PutObjectRequest putObjectRequest = new PutObjectRequest("bucket-name", "object-key", file) .withCannedAcl(CannedAccessControlList.PublicRead); s3ClientV1.putObject(putObjectRequest); // SDK V2 // V2 replaces V1's 'CannedAccessControlList' with 'BucketCannedACL' for buckets and 'ObjectCannedACL' for objects. S3Client s3ClientV2 = S3Client.builder().build(); // Creating a bucket. PutBucketAclRequest bucketRequest = PutBucketAclRequest.builder() .bucket("bucket-name") .acl(BucketCannedACL.PRIVATE) .build(); s3ClientV2.putBucketAcl(bucketRequest); // Creating an object. PutObjectRequest objectRequest = PutObjectRequest.builder() .bucket("bucket-name") .key("object-key") .acl(ObjectCannedACL.PUBLIC_READ) .build(); s3ClientV2.putObject(objectRequest, RequestBody.fromFile(file));

V1 BucketNotificationConfigurationà V2 NotificationConfiguration

//SDK V1 BucketNotificationConfiguration notificationConfig = new BucketNotificationConfiguration(); // Adding configurations by name notificationConfig.addConfiguration("lambdaConfig", new LambdaConfiguration("arn:aws:lambda:function", "s3:ObjectCreated:")); notificationConfig.addConfiguration("topicConfig", new TopicConfiguration("arn:aws:sns:topic", "s3:ObjectRemoved:")); notificationConfig.addConfiguration("queueConfig", new QueueConfiguration("arn:aws:sqs:queue", "s3:ObjectRestore:*")); s3Client.setBucketNotificationConfiguration("bucket", notificationConfig); // SDK V2 // In V2, V1's BucketNotificationConfiguration is renamed to NotificationConfiguration. // V2 contains no common abstract class for LambdaFunction/Topic/Queue configurations. NotificationConfiguration notificationConfig = NotificationConfiguration.builder() .lambdaFunctionConfigurations( LambdaFunctionConfiguration.builder() .lambdaFunctionArn("arn:aws:lambda:function") .events(Event.valueOf("s3:ObjectCreated:")) .build()) .topicConfigurations( TopicConfiguration.builder() .topicArn("arn:aws:sns:topic") .events(Event.valueOf("s3:ObjectRemoved:")) .build()) .queueConfigurations( QueueConfiguration.builder() .queueArn("arn:aws:sqs:queue") .events(Event.valueOf("s3:ObjectRestore:*")) .build()) .build(); s3Client.putBucketNotificationConfiguration(req -> req .bucket("bucket") .notificationConfiguration(notificationConfig));

Méthode mfa MultiFactorAuthenticationde V1 à V2 sur un générateur de requêtes

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