Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon SDK Java v2 S3Client listObjects引发S3Exception_Java_Amazon S3 - Fatal编程技术网

Amazon SDK Java v2 S3Client listObjects引发S3Exception

Amazon SDK Java v2 S3Client listObjects引发S3Exception,java,amazon-s3,Java,Amazon S3,我在AWS S3上保存了文件,使用名称模拟文件夹结构 e、 g.ABC文件夹下的文件sample.jpeg将命名为ABC/sample.jpeg 我正在尝试使用JavaSDK v2以编程方式删除这些文件夹。我正在尝试使用前缀列出这些文件 e、 在上面的例子中,我试图列出bucket中所有前缀为ABC的文件 有问题的是,如果没有这个前缀,SDK会很好地列出文件,但是我的ListObjectsRequest中的前缀正如我在下面的代码中所示,它会抛出s3Exception。异常本身具有一个awsErr

我在AWS S3上保存了文件,使用名称模拟文件夹结构

e、 g.
ABC
文件夹下的文件
sample.jpeg
将命名为
ABC/sample.jpeg

我正在尝试使用JavaSDK v2以编程方式删除这些文件夹。我正在尝试使用
前缀列出这些文件

e、 在上面的例子中,我试图列出bucket中所有前缀为ABC的文件

有问题的是,如果没有这个前缀,SDK会很好地列出文件,但是我的
ListObjectsRequest
中的前缀正如我在下面的代码中所示,它会抛出
s3Exception
。异常本身具有一个
awsErrorDetails
属性,该属性具有一个
sdkHttpResponse
包装
statusCode
302
statusText
“临时移动”

以下是异常跟踪:

software.amazon.awssdk.services.s3.model.S3Exception: null (Service: S3, Status Code: 302, Request ID: null)
at software.amazon.awssdk.core.internal.http.pipeline.stages.HandleResponseStage.handleErrorResponse(HandleResponseStage.java:115) ~[sdk-core-2.7.22.jar:na]
at software.amazon.awssdk.core.internal.http.pipeline.stages.HandleResponseStage.handleResponse(HandleResponseStage.java:73) ~[sdk-core-2.7.22.jar:na]
at software.amazon.awssdk.core.internal.http.pipeline.stages.HandleResponseStage.execute(HandleResponseStage.java:58) ~[sdk-core-2.7.22.jar:na]
at software.amazon.awssdk.core.internal.http.pipeline.stages.HandleResponseStage.execute(HandleResponseStage.java:41) ~[sdk-core-2.7.22.jar:na]
at software.amazon.awssdk.core.internal.http.pipeline.RequestPipelineBuilder$ComposingRequestPipelineStage.execute(RequestPipelineBuilder.java:206) ~[sdk-core-2.7.22.jar:na]
at software.amazon.awssdk.core.internal.http.pipeline.stages.ApiCallAttemptTimeoutTrackingStage.execute(ApiCallAttemptTimeoutTrackingStage.java:64) ~[sdk-core-2.7.22.jar:na]
at software.amazon.awssdk.core.internal.http.pipeline.stages.ApiCallAttemptTimeoutTrackingStage.execute(ApiCallAttemptTimeoutTrackingStage.java:36) ~[sdk-core-2.7.22.jar:na]
at software.amazon.awssdk.core.internal.http.pipeline.stages.TimeoutExceptionHandlingStage.execute(TimeoutExceptionHandlingStage.java:77) ~[sdk-core-2.7.22.jar:na]
at software.amazon.awssdk.core.internal.http.pipeline.stages.TimeoutExceptionHandlingStage.execute(TimeoutExceptionHandlingStage.java:39) ~[sdk-core-2.7.22.jar:na]
at software.amazon.awssdk.core.internal.http.pipeline.stages.RetryableStage$RetryExecutor.doExecute(RetryableStage.java:113) ~[sdk-core-2.7.22.jar:na]
at software.amazon.awssdk.core.internal.http.pipeline.stages.RetryableStage$RetryExecutor.execute(RetryableStage.java:86) ~[sdk-core-2.7.22.jar:na]
at software.amazon.awssdk.core.internal.http.pipeline.stages.RetryableStage.execute(RetryableStage.java:62) ~[sdk-core-2.7.22.jar:na]
at software.amazon.awssdk.core.internal.http.pipeline.stages.RetryableStage.execute(RetryableStage.java:42) ~[sdk-core-2.7.22.jar:na]
at software.amazon.awssdk.core.internal.http.pipeline.RequestPipelineBuilder$ComposingRequestPipelineStage.execute(RequestPipelineBuilder.java:206) ~[sdk-core-2.7.22.jar:na]
at software.amazon.awssdk.core.internal.http.StreamManagingStage.execute(StreamManagingStage.java:57) ~[sdk-core-2.7.22.jar:na]
at software.amazon.awssdk.core.internal.http.StreamManagingStage.execute(StreamManagingStage.java:37) ~[sdk-core-2.7.22.jar:na]
at software.amazon.awssdk.core.internal.http.pipeline.stages.ApiCallTimeoutTrackingStage.executeWithTimer(ApiCallTimeoutTrackingStage.java:80) ~[sdk-core-2.7.22.jar:na]
at software.amazon.awssdk.core.internal.http.pipeline.stages.ApiCallTimeoutTrackingStage.execute(ApiCallTimeoutTrackingStage.java:60) ~[sdk-core-2.7.22.jar:na]
at software.amazon.awssdk.core.internal.http.pipeline.stages.ApiCallTimeoutTrackingStage.execute(ApiCallTimeoutTrackingStage.java:42) ~[sdk-core-2.7.22.jar:na]
at software.amazon.awssdk.core.internal.http.pipeline.RequestPipelineBuilder$ComposingRequestPipelineStage.execute(RequestPipelineBuilder.java:206) ~[sdk-core-2.7.22.jar:na]
at software.amazon.awssdk.core.internal.http.pipeline.RequestPipelineBuilder$ComposingRequestPipelineStage.execute(RequestPipelineBuilder.java:206) ~[sdk-core-2.7.22.jar:na]
at software.amazon.awssdk.core.internal.http.pipeline.stages.ExecutionFailureExceptionReportingStage.execute(ExecutionFailureExceptionReportingStage.java:37) ~[sdk-core-2.7.22.jar:na]
at software.amazon.awssdk.core.internal.http.pipeline.stages.ExecutionFailureExceptionReportingStage.execute(ExecutionFailureExceptionReportingStage.java:26) ~[sdk-core-2.7.22.jar:na]
at software.amazon.awssdk.core.internal.http.AmazonSyncHttpClient$RequestExecutionBuilderImpl.execute(AmazonSyncHttpClient.java:240) ~[sdk-core-2.7.22.jar:na]
at software.amazon.awssdk.core.client.handler.BaseSyncClientHandler.invoke(BaseSyncClientHandler.java:96) ~[sdk-core-2.7.22.jar:na]
at software.amazon.awssdk.core.client.handler.BaseSyncClientHandler.execute(BaseSyncClientHandler.java:120) ~[sdk-core-2.7.22.jar:na]
at software.amazon.awssdk.core.client.handler.BaseSyncClientHandler.execute(BaseSyncClientHandler.java:73) ~[sdk-core-2.7.22.jar:na]
at software.amazon.awssdk.core.client.handler.SdkSyncClientHandler.execute(SdkSyncClientHandler.java:44) ~[sdk-core-2.7.22.jar:na]
at software.amazon.awssdk.awscore.client.handler.AwsSyncClientHandler.execute(AwsSyncClientHandler.java:55) ~[aws-core-2.7.22.jar:na]
at software.amazon.awssdk.services.s3.DefaultS3Client.listObjects(DefaultS3Client.java:2278) ~[s3-2.7.22.jar:na]
下面是我正在使用的代码片段:

    ListObjectsRequest listObjectsRequest = ListObjectsRequest.builder()
            .bucket(this.bucketName)
            .prefix(path)
            .build();

    List<ObjectIdentifier> objectIds = s3client.listObjects(listObjectsRequest)
            .contents()
            .stream()
            .map(s3Object -> ObjectIdentifier.builder().key(s3Object.key()).build())
            .collect(toList());

您是否可以对
s3client
的实例(旧版本和有问题的新版本AWS SDK for Java)进行比较。请分享

可能需要调试和检查。2之间可能存在默认值不同的值。例如,如果默认区域不同,则在没有更改的情况下,您将无法使用新SDK获取以前保存的对象

此外,由于您正在迁移到一个主要修订版,您可能会发现更多问题。它可以引导您参考


如果您只想查看特定的更改,可以选中此项。请检查更改日志中该页面内的链接,您将获得每个方法的更改比较。

我以前也遇到过类似的错误。导致此错误的原因是AWS人员已开始将其API转换为2.x SDK的v2。下面是一段代码片段,无论是否使用前缀,它都可以完美地工作

ListObjectsV2Request request = new ListObjectsV2Request().withBucketName(bucketName).withPrefix(prefix)
                    .withDelimiter(GenericConstants.FORWARD_SLASH);
ListObjectsV2Result result = s3Client.listObjectsV2(request);

如果需要,请随时询问更多详细信息。我对S3的v2 API做了很多工作

鉴于我们在评论中的讨论没有任何结果,我不希望看到这笔赏金白白浪费掉

我已经在我的机器上运行了你的代码(使用相同的AWS SDK版本),但我无法重现异常。如果您仍然遇到此问题,我建议在GitHub存储库中打开一个问题来解释您的问题:

我以前也经历过这个过程,他们通常会在几天内做出回应


如果他们能够解决您的问题,请向我们报告

问题在于aws对
org.apache.httpcomponents:httpclient
的内部依赖性

httpclient
所需的最低版本为
4.5.9
。如果在项目pom中降级该版本,则会出现此问题

要检查正在运行的版本,请尝试:

mvn dependency:tree
查找
httpclient
版本。这就是我的样子:

[INFO] |  +- software.amazon.awssdk:apache-client:jar:2.8.4:runtime
[INFO] |  |  +- org.apache.httpcomponents:httpclient:jar:4.5.10:runtime
[INFO] |  |  |  \- commons-codec:commons-codec:jar:1.11:runtime
[INFO] |  |  \- org.apache.httpcomponents:httpcore:jar:4.4.12:runtime
解决方案:
如果您通过使用任何bom或依赖项管理(在我的案例中,
springbootstarter父级:2.1.5.RELEASE
导致了这种情况)降级了版本,那么只需将其添加到pom中即可&它应该可以工作:

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.9</version>
</dependency>

org.apache.httpcomponents

您是否使用“ABC/”作为前缀,请参阅:@Ironluca我尝试过使用和不使用分隔符,但两种方式都不起作用。此时,我想指出,将版本降级到
2.15.x
实际上解决了我的问题。但是错误仍然无法理解。@Yash版本
2.15.x
不存在。您实际上降级到了哪个版本?在找到引发异常的版本之前,您能否继续增加修补程序/次要版本?@Yash没问题:)谢谢您的快速响应。我在AWS v2上做了很多工作,我以前从未见过这样的东西。
2.5.15
是不引发异常的SDK的最新版本吗?如果我能够复制您的异常,我很乐意在他们的GitHub Repository上打开一个问题。我自己从来没有见过这个异常,但我会看看是否可以使用您使用的相同版本/代码复制它。我在上面的评论中已经提到,降级版本可以解决问题。因此,这个答案并没有解决这个问题。我不依赖SDK的默认区域来保存或删除文件。此外,我仍然可以使用终端列出文件,只是使用这个API和前缀,文件不会被列出。因此,请对您的答案进行向下投票,以避免混淆。您还错误地认为
2.15.x
2.24.x
是一个主要的版本升级。在该评论的末尾,您提到了“但错误仍然无法理解”。并且没有标记此问题已解决。您最初也没有提到要从哪个版本迁移以及要迁移到哪个特定版本。在共享的代码中,你给出了2.7.x,你说你“降级”到了2.15.x。如果您不需要进一步的帮助,请在这里做相应的标记。我请求您重新检查原始问题。降低库的级别是缓解问题,而不是解决问题。这里真正关心的是,代码只在前缀处失败。嘿@Jacob G。谢谢你的努力。我同意让赏金死去是没有意义的。
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.9</version>
</dependency>