S3AsyncClient 对每个区域端点抛出 java.lang.NullPointerException?
S3AsyncClient throws java.lang.NullPointerException with every region endpoint?
我正在尝试将文件上传到 ap-southeast-1 区域中的 AWS 存储桶,凭据已经过验证并且是正确的。
S3AsyncClientBuilder 为每个区域端点抛出空指针异常。
(https://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region)
github 的相关线程在签署区域时遇到问题,但这不是问题,一旦指定了适当的区域。
https://github.com/aws/aws-sdk-java-v2/issues/448
这是访问 AWS Bucket 的 class,为清楚起见,该行已被注释。
public class ObjectUploaderInterfaceImpl implements ObjectUploaderInterface {
private String AWS_ACCESS_KEY;
private String AWS_SECRET_KEY;
private S3AsyncClient s3Client; // Asynchronous Client for Non Blocking IO
private AwsCredentialsProvider credentials;
public ObjectUploaderInterfaceImpl(String awsAccessKey, String awsSecretKey) {
this.AWS_ACCESS_KEY = awsAccessKey;
this.AWS_SECRET_KEY = awsSecretKey;
this.credentials = new StaticCredentialsProvider(
new AwsCredentials(this.AWS_ACCESS_KEY, this.AWS_SECRET_KEY));
try {
this.s3Client = S3AsyncClient.builder()
.credentialsProvider(this.credentials)
.region(Region.AP_SOUTHEAST_1)
.endpointOverride(new URI("s3-ap-southeast-1.amazonaws.com"))
.build(); // Throws Null pointer Exception
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public CompletableFuture<PutObjectResponse> uploadObject(String filePath, String s3Bucket,
String s3BucketPath) {
CompletableFuture<PutObjectResponse> future;
try {
future = s3Client.putObject(
PutObjectRequest.builder()
.bucket(s3Bucket)
.key(s3BucketPath)
.build(),
AsyncRequestProvider.fromFile(Paths.get(filePath))
);
future.whenComplete((resp, err) -> {
if (resp != null) {
System.out.println("Response from Server : " + resp);
} else {
err.printStackTrace();
}
try {
s3Client.close();
} catch (Exception e) {
System.out.println(e);
}
});
} catch (Exception e) {
System.out.println(e.getMessage());
return null;
}
return future;
}
}
Exception Stack如下
java.lang.NullPointerException
at software.amazon.awssdk.config.ImmutableClientConfiguration.lambda$schemeToProtocol(ImmutableClientConfiguration.java:141)
at java.util.stream.ReferencePipeline.accept(ReferencePipeline.java:174)
at java.util.Spliterators$ArraySpliterator.tryAdvance(Spliterators.java:958)
at java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:126)
at java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:498)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:485)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
at java.util.stream.FindOps$FindOp.evaluateSequential(FindOps.java:152)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.findFirst(ReferencePipeline.java:464)
at software.amazon.awssdk.config.ImmutableClientConfiguration.schemeToProtocol(ImmutableClientConfiguration.java:141)
at software.amazon.awssdk.config.ImmutableClientConfiguration.initializeLegacyConfiguration(ImmutableClientConfiguration.java:110)
at software.amazon.awssdk.config.ImmutableClientConfiguration.<init>(ImmutableClientConfiguration.java:48)
at software.amazon.awssdk.config.ImmutableAsyncClientConfiguration.<init>(ImmutableAsyncClientConfiguration.java:42)
at software.amazon.awssdk.client.builder.DefaultClientBuilder.asyncClientConfiguration(DefaultClientBuilder.java:216)
at software.amazon.awssdk.services.s3.DefaultS3AsyncClientBuilder.buildClient(DefaultS3AsyncClientBuilder.java:28)
at software.amazon.awssdk.services.s3.DefaultS3AsyncClientBuilder.buildClient(DefaultS3AsyncClientBuilder.java:22)
at software.amazon.awssdk.client.builder.DefaultClientBuilder.build(DefaultClientBuilder.java:110)
at services.storage.Implementation.ObjectUploaderInterfaceImpl.<init>(ObjectUploaderInterfaceImpl.java:41)
at services.storage.ObjectUploaderInterfaceTest.<init>(ObjectUploaderInterfaceTest.java:12)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
null
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
[error] Test services.storage.ObjectUploaderInterfaceTest.uploadTest failed: java.lang.NullPointerException: null, took 0.008 sec
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
我不确定是什么原因导致的,自 AWS-SDK 2.0 最近发布以来,文档中提供了一些参考资料。
我们需要提供 https 以防止在请求上出现签名问题
已修复
我正在尝试将文件上传到 ap-southeast-1 区域中的 AWS 存储桶,凭据已经过验证并且是正确的。
S3AsyncClientBuilder 为每个区域端点抛出空指针异常。 (https://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region)
github 的相关线程在签署区域时遇到问题,但这不是问题,一旦指定了适当的区域。
https://github.com/aws/aws-sdk-java-v2/issues/448
这是访问 AWS Bucket 的 class,为清楚起见,该行已被注释。
public class ObjectUploaderInterfaceImpl implements ObjectUploaderInterface {
private String AWS_ACCESS_KEY;
private String AWS_SECRET_KEY;
private S3AsyncClient s3Client; // Asynchronous Client for Non Blocking IO
private AwsCredentialsProvider credentials;
public ObjectUploaderInterfaceImpl(String awsAccessKey, String awsSecretKey) {
this.AWS_ACCESS_KEY = awsAccessKey;
this.AWS_SECRET_KEY = awsSecretKey;
this.credentials = new StaticCredentialsProvider(
new AwsCredentials(this.AWS_ACCESS_KEY, this.AWS_SECRET_KEY));
try {
this.s3Client = S3AsyncClient.builder()
.credentialsProvider(this.credentials)
.region(Region.AP_SOUTHEAST_1)
.endpointOverride(new URI("s3-ap-southeast-1.amazonaws.com"))
.build(); // Throws Null pointer Exception
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public CompletableFuture<PutObjectResponse> uploadObject(String filePath, String s3Bucket,
String s3BucketPath) {
CompletableFuture<PutObjectResponse> future;
try {
future = s3Client.putObject(
PutObjectRequest.builder()
.bucket(s3Bucket)
.key(s3BucketPath)
.build(),
AsyncRequestProvider.fromFile(Paths.get(filePath))
);
future.whenComplete((resp, err) -> {
if (resp != null) {
System.out.println("Response from Server : " + resp);
} else {
err.printStackTrace();
}
try {
s3Client.close();
} catch (Exception e) {
System.out.println(e);
}
});
} catch (Exception e) {
System.out.println(e.getMessage());
return null;
}
return future;
}
}
Exception Stack如下
java.lang.NullPointerException
at software.amazon.awssdk.config.ImmutableClientConfiguration.lambda$schemeToProtocol(ImmutableClientConfiguration.java:141)
at java.util.stream.ReferencePipeline.accept(ReferencePipeline.java:174)
at java.util.Spliterators$ArraySpliterator.tryAdvance(Spliterators.java:958)
at java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:126)
at java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:498)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:485)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
at java.util.stream.FindOps$FindOp.evaluateSequential(FindOps.java:152)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.findFirst(ReferencePipeline.java:464)
at software.amazon.awssdk.config.ImmutableClientConfiguration.schemeToProtocol(ImmutableClientConfiguration.java:141)
at software.amazon.awssdk.config.ImmutableClientConfiguration.initializeLegacyConfiguration(ImmutableClientConfiguration.java:110)
at software.amazon.awssdk.config.ImmutableClientConfiguration.<init>(ImmutableClientConfiguration.java:48)
at software.amazon.awssdk.config.ImmutableAsyncClientConfiguration.<init>(ImmutableAsyncClientConfiguration.java:42)
at software.amazon.awssdk.client.builder.DefaultClientBuilder.asyncClientConfiguration(DefaultClientBuilder.java:216)
at software.amazon.awssdk.services.s3.DefaultS3AsyncClientBuilder.buildClient(DefaultS3AsyncClientBuilder.java:28)
at software.amazon.awssdk.services.s3.DefaultS3AsyncClientBuilder.buildClient(DefaultS3AsyncClientBuilder.java:22)
at software.amazon.awssdk.client.builder.DefaultClientBuilder.build(DefaultClientBuilder.java:110)
at services.storage.Implementation.ObjectUploaderInterfaceImpl.<init>(ObjectUploaderInterfaceImpl.java:41)
at services.storage.ObjectUploaderInterfaceTest.<init>(ObjectUploaderInterfaceTest.java:12)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
null
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
[error] Test services.storage.ObjectUploaderInterfaceTest.uploadTest failed: java.lang.NullPointerException: null, took 0.008 sec
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
我不确定是什么原因导致的,自 AWS-SDK 2.0 最近发布以来,文档中提供了一些参考资料。
我们需要提供 https 以防止在请求上出现签名问题
已修复