尝试使用Java SDK从S3 Bucket下载文件时,isStandardEndpoint出现空指针异常。

3

我正在尝试连接到S3存储桶并下载文件,但代码抛出异常:

在我的代码中,我有

ProfileCredentialsProvider pcp = new ProfileCredentialsProvider("assumed_role");
        bucketName = "dev-data-extract-service-bucket";
s3Client = AmazonS3ClientBuilder.standard().withCredentials(pcp).withRegion(Regions.US_EAST_1.toString()).build();

我在调用以下行时遇到了NullPointerException异常:
fullObject = s3Client.getObject(new GetObjectRequest(bucketName, "TR09_20190205.detail"));

原因是Endpoint中的主机值为null,这是AmazonS3Client类的问题。
private boolean isStandardEndpoint(URI endpoint) {
        return endpoint.getHost().endsWith("s3.amazonaws.com");
}

以下是堆栈跟踪

[main] DEBUG com.amazonaws.AmazonWebServiceClient - 成功配置内部日志记录到commons logger: true 15:43:45.183 [main] DEBUG com.amazonaws.metrics.AwsSdkMetrics - 管理MBean已注册为com.amazonaws.management:type=AwsSdkMetrics 15:43:45.952 [main] DEBUG com.amazonaws.monitoring.CsmConfigurationProviderChain - 无法从 com.amazonaws.monitoring.EnvironmentVariableCsmConfigurationProvider@169e6180 加载配置: 无法从环境变量中加载客户端监视配置!15:43:45.952 [main] DEBUG com.amazonaws.monitoring.CsmConfigurationProviderChain - 无法从 com.amazonaws.monitoring.SystemPropertyCsmConfigurationProvider@35aea049 加载配置: 无法从系统属性中加载客户端监视配置!15:43:45.952 [java-sdk-http-connection-reaper] DEBUG org.apache.http.impl.conn.PoolingHttpClientConnectionManager - 关闭超过60000毫秒空闲的连接15:43:45.952 [main] DEBUG com.amazonaws.monitoring.CsmConfigurationProviderChain - 无法从com.amazonaws.monitoring.ProfileCsmConfigurationProvider@611889f4 加载配置文件 异常线程“main”中的“java.lang.NullPointerException” 在com.amazonaws.services.s3.AmazonS3Client.isStandardEndpoint(AmazonS3Client.java:3772) at com.amazonaws.services.s3.AmazonS3Client.noExplicitRegionProvided(AmazonS3Client.java:3767) at com.amazonaws.services.s3.AmazonS3Client.bucketRegionShouldBeCached(AmazonS3Client.java:4505) at com.amazonaws.services.s3.AmazonS3Client.shouldPerformHeadRequestToFindRegion(AmazonS3Client.java:4501) at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:4426) at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:4390) at com.amazonaws.services.s3.AmazonS3Client.getAcl(AmazonS3Client.java:3573) at com.amazonaws.services.s3.AmazonS3Client.getBucketAcl(AmazonS3Client.java:1186) at com.amazonaws.services.s3.AmazonS3Client.getBucketAcl(AmazonS3Client.java:1176) at com.amazonaws.services.s3.AmazonS3Client.doesBucketExistV2(AmazonS3Client.java:1312) at .AWSHelper.downloadFromS3Bucket(AWSHelper.java:32) 在 .AWSHelper.main(AWSHelper.java:59)


1
嗨,Nader。欢迎来到Stack Overflow。感谢您抽出时间提供一个写得很好、清晰明了的问题。问候。 - Elletlar
1个回答

7
我是一名能翻译文本的有用助手。

我认为你的问题源自于你设置区域的方式。我认为该区域的解析结果为空,导致你的端点也为空。

改为:

s3Client = AmazonS3ClientBuilder.standard().withCredentials(pcp).withRegion(Regions.US_EAST_1.toString()).build();

尝试:

s3Client = AmazonS3ClientBuilder.standard().withCredentials(pcp).withRegion(Regions.US_EAST_1).build();

Regions类没有覆盖toString()方法,因此它不会返回地区名称,这是你的代码需要正常工作所必须的。


感谢您的帮助。但我很惊讶为什么Amazon SDK不能处理这个问题并抛出带有适当错误消息的异常。它只是抛出空指针异常。 - Kunal Saini
在我的情况下,我正在使用旧版的 AWS SDK 并尝试调用 me-south(这是新区域)AWSCredentialsProvider credentialsProvider = new AWSStaticCredentialsProvider(new BasicAWSCredentials(ACCESS_KEY, SECRET_KEY )); AmazonS3 s3Client = AmazonS3ClientBuilder.standard().withCredentials(credentialsProvider).withRegion(Regions.ME_SOUTH_1).build(); - shareef

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接