【问题标题】:Trying to download files from S3 Bucket using Java SDK, Null pointer Exception on isStandardEndpoint尝试使用 Java SDK 从 S3 存储桶下载文件,isStandardEndpoint 上出现空指针异常
【发布时间】:2019-02-07 23:04:14
【问题描述】:

我正在尝试连接到 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 中的 host 值为 null 这是来自 AmazonS3Client 类

private boolean isStandardEndpoint(URI endpoint) {
        return endpoint.getHost().endsWith("s3.amazonaws.com");
}

以下是堆栈跟踪

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

【问题讨论】:

  • 嗨纳德。欢迎来到堆栈溢出。感谢您抽出宝贵时间提供一个写得很好且清晰的问题。问候。

标签: java amazon-s3 endpoint


【解决方案1】:

我认为您的问题源于您设置区域的方式。我认为该区域正在解析为 null,这导致您的端点为 null。

代替:

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 不处理这个并抛出一个带有正确错误消息的异常。它只是抛出空指针异常
  • 在我的情况下,我使用旧的 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();
猜你喜欢
  • 2020-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-01
  • 1970-01-01
  • 2019-05-30
  • 2021-06-09
  • 1970-01-01
相关资源
最近更新 更多