0

您好我目前正在开发一个连接到 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();
        }
    }
}

和错误日志;

在此处输入图像描述

4

0 回答 0