S3尝试使用AWS Java v2 SDK完成多部分上传时出现异常

dkqlctbz  于 2022-12-21  发布在  Java
关注(0)|答案(1)|浏览(321)

我正在尝试使用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();

然而,声纳抱怨说:
请考虑使用使用者生成器方法,而不是创建此嵌套生成器。
所以我对请求做了一个小小的改动:

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

声纳警告消失了,但随后上传开始抛出以下异常:
线程"主"软件中出现异常。您提供的XML格式不正确,或者未针对我们发布的架构进行验证(服务:S3,状态代码:400,请求编号:xxx,扩展请求ID:xxx)在软件。亚马逊。awssdk。协议。xml。内部。unmarshall。awsxml预测响应处理程序。处理错误响应(awsxml预测响应处理程序。java:156)
有什么问题吗?

ercv8c1e

ercv8c1e1#

您在这里使用的消费者方法具有multipartUpload(Consumer<CompletedMultipartUpload.Builder> multipartUpload)signature
在更新后的代码中,您传递了一个函数,该函数接受CompletedPart对象列表作为输入,并返回一个CompletedMultipartUpload对象。
这与签名不匹配,因为您没有传入只接收构建器的消费者。

更新您的代码,只需在提供的构建器对象上设置部件-您不需要自己构建它。

该方法的文件也对此进行了说明:
这是创建CompletedMultipartUpload.Builder * 示例的一种便利,从而避免了通过CompletedMultipartUpload.builder()手动 * 创建示例的需要。
试试这个:

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

相关问题