You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AWS Java SDK V2为S3恢复请求加Description参数触发400异常

AWS Java SDK V2恢复Glacier对象时添加Description参数触发XML格式错误问题

问题场景

  1. 可正常执行的恢复代码:仅配置glacierJobParameters(Tier设为STANDARD)和days参数时,从Glacier Deep Archive恢复对象到S3标准存储的请求可成功执行:
try {
    S3Client s3Client = S3Client.builder().build();
    System.out.println("S3 client created. . .");

    RestoreRequest restoreRequest = RestoreRequest.builder()
            .glacierJobParameters(GlacierJobParameters.builder().tier(Tier.STANDARD).build())
            .days(1)
            .build();

    RestoreObjectRequest objectRequest = RestoreObjectRequest.builder()
            .bucket("myBucket")
            .key("data/myObject.zip")
            .restoreRequest(restoreRequest)
            .build(); 

    s3Client.restoreObject(objectRequest);
} catch(Exception e){
    e.printStackTrace();
}
  1. 触发异常的代码:在RestoreRequest中添加description参数后,调用s3Client.restoreObject(objectRequest)会抛出S3Exception:
try {
    S3Client s3Client = S3Client.builder().build();
    System.out.println("S3 client created. . .");

    RestoreRequest restoreRequest = RestoreRequest.builder()
            .glacierJobParameters(GlacierJobParameters.builder().tier(Tier.STANDARD).build())
            .days(1)
            .description("description about the object")
            .build();

    RestoreObjectRequest objectRequest = RestoreObjectRequest.builder()
            .bucket("myBucket")
            .key("data/myObject.zip")
            .restoreRequest(restoreRequest)
            .build(); 

    s3Client.restoreObject(objectRequest);
} catch(Exception e){
    e.printStackTrace();
}

异常信息

software.amazon.awssdk.services.s3.model.S3Exception: 你提供的XML格式不正确,或不符合我们发布的模式(服务:S3,状态码:400,请求ID:0Y7K1MVBGP5SP9FS,扩展请求ID:DZfX93DOWguFo0MVnTR3Awk9i5gG867rkZnTLU4bAueRQqjBhkq5eTjFWzltJRpxMYa5LmnWal0=)
at software.amazon.awssdk.protocols.xml.internal.unmarshall.AwsXmlPredicatedResponseHandler.handleErrorResponse(AwsXmlPredicatedResponseHandler.java:156)
at software.amazon.awssdk.protocols.xml.internal.unmarshall.AwsXmlPredicatedResponseHandler.handleResponse(AwsXmlPredicatedResponseHandler.java:108)
at software.amazon.awssdk.protocols.xml.internal.unmarshall.AwsXmlPredicatedResponseHandler.handle(AwsXmlPredicatedResponseHandler.java:85)
at software.amazon.awssdk.protocols.xml.internal.unmarshall.AwsXmlPredicatedResponseHandler.handle(AwsXmlPredicatedResponseHandler.java:43)
at software.amazon.awssdk.awscore.client.handler.AwsSyncClientHandler$Crc32ValidationResponseHandler.handle(AwsSyncClientHandler.java:95)
at software.amazon.awssdk.core.internal.handler.BaseClientHandler.lambda$successTransformationResponseHandler$7(BaseClientHandler.java:245)
at software.amazon.awssdk.core.internal.http.pipeline.stages.HandleResponseStage.execute(HandleResponseStage.java:40)
at software.amazon.awssdk.core.internal.http.pipeline.stages.HandleResponseStage.execute(HandleResponseStage.java:30)
at software.amazon.awssdk.core.internal.http.pipeline.RequestPipelineBuilder$ComposingRequestPipelineStage.execute(RequestPipelineBuilder.java:206)
at software.amazon.awssdk.core.internal.http.pipeline.stages.ApiCallAttemptTimeoutTrackingStage.execute(ApiCallAttemptTimeoutTrackingStage.java:73)
at software.amazon.awssdk.core.internal.http.pipeline.stages.ApiCallAttemptTimeoutTrackingStage.execute(ApiCallAttemptTimeoutTrackingStage.java:42)
at software.amazon.awssdk.core.internal.http.pipeline.stages.TimeoutExceptionHandlingStage.execute(TimeoutExceptionHandlingStage.java:78)
at software.amazon.awssdk.core.internal.http.pipeline.stages.TimeoutExceptionHandlingStage.execute(TimeoutExceptionHandlingStage.java:40)
at software.amazon.awssdk.core.internal.http.pipeline.stages.ApiCallAttemptMetricCollectionStage.execute(ApiCallAttemptMetricCollectionStage.java:50)
at software.amazon.awssdk.core.internal.http.pipeline.stages.ApiCallAttemptMetricCollectionStage.execute(ApiCallAttemptMetricCollectionStage.java:36)
at software.amazon.awssdk.core.internal.http.pipeline.stages.RetryableStage.execute(RetryableStage.java:81)
at software.amazon.awssdk.core.internal.http.pipeline.stages.RetryableStage.execute(RetryableStage.java:36)
at software.amazon.awssdk.core.internal.http.pipeline.RequestPipelineBuilder$ComposingRequestPipelineStage.execute(RequestPipelineBuilder.java:206)
at software.amazon.awssdk.core.internal.http.StreamManagingStage.execute(StreamManagingStage.java:56)
at software.amazon.awssdk.core.internal.http.StreamManagingStage.execute(StreamManagingStage.java:36)
at software.amazon.awssdk.core.internal.http.pipeline.stages.ApiCallTimeoutTrackingStage.executeWithTimer(ApiCallTimeoutTrackingStage.java:80)
at software.amazon.awssdk.core.internal.http.pipeline.stages.ApiCallTimeoutTrackingStage.execute(ApiCallTimeoutTrackingStage.java:60)
at software.amazon.awssdk.core.internal.http.pipeline.stages.ApiCallTimeoutTrackingStage.execute(ApiCallTimeoutTrackingStage.java:42)
at software.amazon.awssdk.core.internal.http.pipeline.stages.ApiCallMetricCollectionStage.execute(ApiCallMetricCollectionStage.java:48)
at software.amazon.awssdk.core.internal.http.pipeline.stages.ApiCallMetricCollectionStage.execute(ApiCallMetricCollectionStage.java:31)
at software.amazon.awssdk.core.internal.http.pipeline.RequestPipelineBuilder$ComposingRequestPipelineStage.execute(RequestPipelineBuilder.java:206)
at software.amazon.awssdk.core.internal.http.pipeline.RequestPipelineBuilder$ComposingRequestPipelineStage.execute(RequestPipelineBuilder.java:206)
at software.amazon.awssdk.core.internal.http.pipeline.stages.ExecutionFailureExceptionReportingStage.execute(ExecutionFailureExceptionReportingStage.java:37)
at software.amazon.awssdk.core.internal.http.pipeline.stages.ExecutionFailureExceptionReportingStage.execute(ExecutionFailureExceptionReportingStage.java:26)
at software.amazon.awssdk.core.internal.http.AmazonSyncHttpClient$RequestExecutionBuilderImpl.execute(AmazonSyncHttpClient.java:193)
at software.amazon.awssdk.core.internal.handler.BaseSyncClientHandler.invoke(BaseSyncClientHandler.java:103)
at software.amazon.awssdk.core.internal.handler.BaseSyncClientHandler.doExecute(BaseSyncClientHandler.java:167)
at software.amazon.awssdk.core.internal.handler.BaseSyncClientHandler.lambda$execute$1(BaseSyncClientHandler.java:82)
at software.amazon.awssdk.core.internal.handler.BaseSyncClientHandler.measureApiCallSuccess(BaseSyncClientHandler.java:175)
at software.amazon.awssdk.core.internal.handler.BaseSyncClientHandler.execute(BaseSyncClientHandler.java:76)
at software.amazon.awssdk.core.client.handler.SdkSyncClientHandler.execute(SdkSyncClientHandler.java:45)
at software.amazon.awssdk.awscore.client.handler.AwsSyncClientHandler.execute(AwsSyncClientHandler.java:56)
at software.amazon.awssdk.services.s3.DefaultS3Client.restoreObject(DefaultS3Client.java:10422)
at org.example.App.main(App.java:150)

问题原因及解决方法

原因

S3 Glacier恢复请求的XML Schema不支持在顶层直接添加Description字段。当你在RestoreRequest顶层设置description时,SDK生成的XML会将该字段放在根节点下,不符合S3要求的格式,因此触发400格式错误。

正确代码

将description参数嵌套到GlacierJobParameters的构建器中:

try {
    S3Client s3Client = S3Client.builder().build();
    System.out.println("S3 client created. . .");

    RestoreRequest restoreRequest = RestoreRequest.builder()
            .glacierJobParameters(GlacierJobParameters.builder()
                    .tier(Tier.STANDARD)
                    .description("description about the object")
                    .build())
            .days(1)
            .build();

    RestoreObjectRequest objectRequest = RestoreObjectRequest.builder()
            .bucket("myBucket")
            .key("data/myObject.zip")
            .restoreRequest(restoreRequest)
            .build(); 

    s3Client.restoreObject(objectRequest);
} catch(Exception e){
    e.printStackTrace();
}

格式说明

S3 Glacier要求的正确XML格式(简化版)如下,Description必须嵌套在GlacierJobParameters节点内:

<RestoreRequest>
  <Days>1</Days>
  <GlacierJobParameters>
    <Tier>STANDARD</Tier>
    <Description>description about the object</Description>
  </GlacierJobParameters>
</RestoreRequest>

内容的提问来源于stack exchange,提问作者Shariq Ali

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 19:40:51