繁体   English   中英

尝试使用 AWS Java v2 SDK 完成分段上传时出现 S3Exception

[英]S3Exception when trying to complete multi-part upload using the AWS Java v2 SDK

我正在尝试使用 AWS SDK for Java v2 在 Java 11 中完成到 S3 的多部分上传。

我的CompleteMultipartUploadRequest最初看起来像这样,并且功能正常:

CompleteMultipartUploadRequest completeMultipartUploadRequest = CompleteMultipartUploadRequest
                .builder()
                .bucket(s3BucketName)
                .key(fileName)
                .uploadId(uploadId)
                .multipartUpload(CompletedMultipartUpload.builder().parts(completedParts).build())
                .build();
CompleteMultipartUploadResponse completedUploadResponse = s3Client.completeMultipartUpload(completeMultipartUploadRequest);
return completedUploadResponse.location();

但是,Sonar 抱怨:

考虑使用 Consumer Builder 方法而不是创建此嵌套构建器。

所以我对请求做了一个小改动:

CompleteMultipartUploadRequest completeMultipartUploadRequest = CompleteMultipartUploadRequest
                .builder()
                .bucket(s3BucketName)
                .key(fileName)
                .uploadId(uploadId)
                .multipartUpload(completedParts -> CompletedMultipartUpload.builder().parts(completedParts).build())
                .build();
CompleteMultipartUploadResponse completedUploadResponse = s3Client.completeMultipartUpload(completeMultipartUploadRequest);
return completedUploadResponse.location();

声纳警告消失了,但随后上传开始抛出以下异常:

线程“主”software.amazon.awssdk.services.s3.model.S3Exception 中的异常:您提供的 XML 格式不正确或未根据我们发布的架构进行验证(服务:S3,状态代码:400,请求 ID: xxx,扩展请求 ID:xxx)在 software.amazon.awssdk.protocols.xml.internal.unmarshall.AwsXmlPredicatedResponseHandler.handleErrorResponse(AwsXmlPredicatedResponseHandler.java:156)

有什么问题?

您在此处使用的消费者方法具有multipartUpload(Consumer<CompletedMultipartUpload.Builder> multipartUpload)签名

在您更新的代码中,您正在传递一个函数,该函数将CompletedPart对象列表作为输入并返回CompletedMultipartUpload对象。

这与签名不匹配,因为您没有传入只接收构建器的消费者。

更新您的代码以简单地在提供的构建器对象上设置部件——您不需要自己构建它。

该方法的文档也说明了这一点:

这是一种创建CompletedMultipartUpload.Builder实例的便利,避免了通过CompletedMultipartUpload.builder()手动创建实例的需要

试试这个:

CompleteMultipartUploadRequest completeMultipartUploadRequest = CompleteMultipartUploadRequest.builder()
                .bucket(bucketName)
                .key(keyName)
                .uploadId(uploadId)
                .multipartUpload(completedMultipartUpload -> completedMultipartUpload.parts(completedParts))
                .build();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM