尝试使用 Java SDK 从 S3 Bucket 下载文件,isStandardEndpoint 上的空指针异常

nad*_*hat 3 java amazon-s3 endpoint

我正在尝试连接到 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();
Run Code Online (Sandbox Code Playgroud)

调用以下行时出现 NullPointerException 异常:

fullObject = s3Client.getObject(new GetObjectRequest(bucketName, "TR09_20190205.detail"));
Run Code Online (Sandbox Code Playgroud)

原因是 Endpoint 中的主机值为 null 这是来自 AmazonS3Client 类

private boolean isStandardEndpoint(URI endpoint) {
        return endpoint.getHost().endsWith("s3.amazonaws.com");
}
Run Code Online (Sandbox Code Playgroud)

以下是堆栈跟踪

[main] DEBUG com.amazonaws.AmazonWebServiceClient - 内部日志记录成功配置到 commons 记录器:true 15:43:45.183 [main] DEBUG com.amazonaws.metrics.AwsSdkMetrics - 在 com.amazonaws.management:type=AwsSdkMetrics 下注册的管理 mbean :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。

red*_*rdo 5

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

代替:

s3Client = AmazonS3ClientBuilder.standard().withCredentials(pcp).withRegion(Regions.US_EAST_1.toString()).build();
Run Code Online (Sandbox Code Playgroud)

尝试:

s3Client = AmazonS3ClientBuilder.standard().withCredentials(pcp).withRegion(Regions.US_EAST_1).build();
Run Code Online (Sandbox Code Playgroud)

Regions 类不会覆盖 toString() 方法,因此它不会返回区域名称,这是您的代码正常工作所需的。