您好我目前正在开发一个连接到 AWS S3 以保存文档的 Java 应用程序,我使用的是 sdk 1.12.122 版本并且也支持 SigV4。在获取预签名 URL 以将文档上传到 S3 时,我收到“使用构建器创建时客户端是不可变的”错误。任何人都可以帮助解决这个问题吗?这是生成uploadUrl的代码段,
public SignUrlS3DTO generateUploadUrl(final String fileName, final String contentType, final String contextId,
final String contextType) {
final UUID uuid = UUID.randomUUID();
final String ext = FilenameUtils.getExtension(fileName);
final String objectKey = applicationEnv.getDeploymentenv().concat("/") + uuid + "." + ext;
final String bucketName = awsS3Settings.getBucketName();
final String bucketRegion = awsS3Settings.getRegion();
final Regions clientRegion = Regions.fromName(bucketRegion);
final AmazonS3 s3Client = awsS3CredentialConfig.getAmazonS3Client();
s3Client.setRegion(Region.getRegion(clientRegion));
s3Client.setS3ClientOptions( S3ClientOptions.builder().setPathStyleAccess(true).build());
final Date expiration = new Date();
long expTimeMillis = expiration.getTime();
expTimeMillis += 1000 * 60 * 60; // 1 hour.
expiration.setTime(expTimeMillis);
final GeneratePresignedUrlRequest preSignedUrl = new GeneratePresignedUrlRequest(bucketName, objectKey);
preSignedUrl.setMethod(HttpMethod.PUT);
preSignedUrl.setExpiration(expiration);
preSignedUrl.addRequestParameter(Headers.S3_CANNED_ACL, CannedAccessControlList.Private.toString());
preSignedUrl.setContentType(contentType);
final URL url = s3Client.generatePresignedUrl(preSignedUrl);
final SignUrlS3DTO sDto = new SignUrlS3DTO();
sDto.setFileName(uuid + "." + ext);
sDto.setSignedUrl(url.toString());
return sDto;
}
和 awsS3CredentialConfig.getAmazonS3Client() 方法如下;
public class AwsS3CredentialConfig {
@Autowired
private ApplicationEnv applicationEnv;
/**
* Get amazon s3 client amazon s3 client.
*
* @return the amazon s3 client
*/
@Bean(name = "amazonS3ClientWithInstanceRoles")
@Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON)
public AmazonS3 getAmazonS3Client(){
if(applicationEnv.getDeploymentenv().equalsIgnoreCase(MediaServiceConstant.PROD)) {
return AmazonS3ClientBuilder.standard()
.withCredentials(new ProfileCredentialsProvider())
.build();
}else{
return AmazonS3ClientBuilder.standard()
.build();
}
}
}
和错误日志;