使用AWS Java v2 SDK完成S3分片上传时遇S3Exception问题
S3分片上传修改后XML格式错误的原因及修复
你遇到的问题根源是误用了multipartUpload的Consumer重载方法,导致生成的请求不符合S3的XML规范。
错误原因解析
Sonar提示的"使用Consumer Builder方法",指的是SDK提供的这类方法参数是Consumer<T.Builder>,作用是让你直接操作SDK传入的Builder实例,而非自己嵌套创建Builder并返回对象。你当前的写法:
.multipartUpload(completedParts -> CompletedMultipartUpload.builder().parts(completedParts).build())
这里的lambda参数completedParts其实是SDK传入的CompletedMultipartUpload.Builder对象,但你把它当成了分片列表completedParts来使用,相当于用一个Builder去调用parts()方法,最终生成的multipartUpload对象完全没有正确设置分片信息,S3收到的自然是格式错误的XML,所以返回400错误。
正确的修改方式
把lambda改成直接对传入的Builder调用parts()方法,不需要自己新建Builder或调用build():
CompleteMultipartUploadRequest completeMultipartUploadRequest = CompleteMultipartUploadRequest .builder() .bucket(s3BucketName) .key(fileName) .uploadId(uploadId) .multipartUpload(builder -> builder.parts(completedParts)) // 直接操作SDK传入的Builder .build(); CompleteMultipartUploadResponse completedUploadResponse = s3Client.completeMultipartUpload(completeMultipartUploadRequest); return completedUploadResponse.location();
为什么这样有效
这个Consumer风格的Builder方法,会由SDK自动创建CompletedMultipartUpload.Builder实例传给lambda,你只需要在lambda里完成配置(比如设置分片列表),SDK最后会自动调用build()生成正确的对象。这样既满足了Sonar避免嵌套Builder的要求,又能生成符合S3规范的请求。
内容的提问来源于stack exchange,提问作者SRJ
相关产品推荐
相关产品推荐

