ããã¯ããªã«ãããããŠæžãããã®ïŒ
AWS SDK for Java 2.xã䜿ããšãAPIã®åçš®ã¬ã¹ãã³ã¹ããSdkHttpResponse
ãšããã€ã³ã¿ãŒãã§ãŒã¹ã®ã€ã³ã¹ã¿ã³ã¹ãååŸããããšã
ã§ããŸãã
ãã¡ãã§ããã
SdkHttpResponse (AWS SDK for Java - 2.20.17)
ãã®ã¯ã©ã¹ã«ã¯isSuccessful
ãšããæåïŒå€±æãå€å®ã§ããããªã¡ãœããããããŸãã
If we get back any 2xx status code, then we know we should treat the service call as successful.
APIã®åŒã³åºãçµæãæ±ãæã«ããšã©ãŒãã³ããªã³ã°ãšããŠãã®å€ãèŠãæ¹ãããã®ãã©ããªã®ãããããããªãã£ãã®ã§ãã¡ãã£ãš
調ã¹ãŠã¿ãããšã«ããŸããã
Amazon S3ãäŸã«
Amazon S3ãäŸã«ãã¡ãã£ãšèŠãŠã¿ãŸãããã
Amazon S3ã«ã¢ã¯ã»ã¹ããéã«ã¯ãS3Client
ãšããã€ã³ã¿ãŒãã§ãŒã¹ïŒãŸãã¯S3AsyncClient
ïŒã䜿ããŸãã
S3Client (AWS SDK for Java - 2.20.17)
ãã±ãããäœæããcreateBucket
ãèŠãŠã¿ããšãåé¡ããã£ãæã«ã¯ä»¥äžã®ããã«äŸå€ãã¹ããŒãããã§ãããããšãããããŸãã
default CreateBucketResponse createBucket(CreateBucketRequest createBucketRequest) throws BucketAlreadyExistsException, BucketAlreadyOwnedByYouException, AwsServiceException, SdkClientException, S3Exception
äžæ¹ã§ããã®æ»ãå€ã§ããCreateBucketResponse
ã®å®çŸ©ãèŠããšãsdkHttpResponse
ãšããã¡ãœãããããã
CreateBucketResponse (AWS SDK for Java - 2.20.17)
ãã¡ãããå
è¿°ã®SdkHttpResponse
ãåŸãããšãã§ããisSuccessful
ãšããã¡ãœãããåããŠããŸãã
ãããèŠãŠãããšãã¹ããŒãããäŸå€ãšã¯å¥ã«SdkHttpResponse#isSuccessful
ã®çµæãèŠãªããšãããªãã®ã§ã¯ïŒãšæã£ãŠããŸã£ãã®ã
ä»åã®ãšã³ããªãŒãæžããçç±ã§ããã
ããã¥ã¡ã³ãã¯ã©ãèšã£ãŠãããïŒ
ããã§ãAWS SDK for Java 2.xã®äŸå€åŠçã®ããã¥ã¡ã³ããèŠãŠã¿ãŸãããã
AWS SDK for Java 2.x の例外処理 - AWS SDK for Java 2.x
AwsServiceException
ããã³ãã®ãµãã¯ã©ã¹ã«é¢ããèšè¿°ãèŠããšãAPIåŒã³åºãæã«ãšã©ãŒãçºçããæã¯AwsServiceException
ã®
ã€ã³ã¹ã¿ã³ã¹ïŒããã³ãã®ãµãã¯ã©ã¹å«ãïŒãã¹ããŒãããããšãæžãããŠããŸãã
AWS SDK for Java 2.x ã®äŸå€åŠç / AwsServiceException (ããã³ãµãã¯ã©ã¹)
ããšãã°ãæåã«æžããS3Client#createBucket
ã¡ãœããããã¹ããŒããããšãããŠããBucketAlreadyOwnedByYouException
ã¯ã©ã¹ãã
AwsServiceException
ã®ãµãã¯ã©ã¹ã§ããã
BucketAlreadyOwnedByYouException (AWS SDK for Java - 2.20.17)
äŸå€ã®è©³çްã«ã€ããŠã¯ãAwsErrorDetails
ã¯ã©ã¹ã確èªããã°ããããšãªã£ãŠããŸãã
AwsErrorDetails (AWS SDK for Java - 2.20.17)
ãã¡ãã®errorCode
ãããåãµãŒãã¹ã®ããã¥ã¡ã³ãã確èªããããšãã§ããŸããããšãã°ãAmazon S3ã®å Žåã¯ãã¡ãã
Error Responses / List of Error Codes
AwsErrorDetails
ã®ã€ã³ã¹ã¿ã³ã¹ã¯ãAwsServiceException
ããååŸã§ããŸãã
AwsServiceException (AWS SDK for Java - 2.20.17)
ãŸããããããAPIåŒã³åºããã§ããªããããªç¶æ³ã®æã«ã¯SdkClientException
ãã¹ããŒãããããšãæžãããŠããŸãã
AWS SDK for Java 2.x ã®äŸå€åŠç / SdkClientException
ãã¡ãã§ããã
SdkClientException (AWS SDK for Java - 2.20.17)
ã©ã¡ãã«ãããSdkHttpResponse
ã€ã³ã¿ãŒãã§ãŒã¹ã¯ãŸã£ããç»å ŽããŸããã
ãã®ããšãããAPIã®åŒã³åºãã«å€±æãããšäŸå€ãã¹ããŒãããã®ã§ãAPIåŒã³åºãã®æå確èªã«SdkHttpResponse#isSuccessful
ã¡ãœããã
åç
§ããªããŠãè¯ããããªæ°ãããŸããã
ä»åããã¡ããããå°ã远ã£ãŠã¿ãŸããããLocalStackãšAWS SDK for Java 2.xã®S3Client
ã䜿ã£ãŠè©ŠããŠã¿ãããšæããŸãã
ç°å¢
ä»åã®ç°å¢ã¯ããã¡ãã
LocalStackã
$ python3 -V Python 3.10.6 $ localstack --version 1.4.0
èµ·åã
$ localstack start
JavaãŸããã
$ java --version openjdk 17.0.6 2023-01-17 OpenJDK Runtime Environment (build 17.0.6+10-Ubuntu-0ubuntu122.04) OpenJDK 64-Bit Server VM (build 17.0.6+10-Ubuntu-0ubuntu122.04, mixed mode, sharing) $ mvn --version Apache Maven 3.9.0 (9b58d2bad23a66be161c4664ef21ce219c2c8584) Maven home: $HOME/.sdkman/candidates/maven/current Java version: 17.0.6, vendor: Private Build, runtime: /usr/lib/jvm/java-17-openjdk-amd64 Default locale: ja_JP, platform encoding: UTF-8 OS name: "linux", version: "5.15.0-67-generic", arch: "amd64", family: "unix"
æºå
MavenäŸåé¢ä¿ãªã©ã¯ããã¡ãã
<properties> <maven.compiler.source>17</maven.compiler.source> <maven.compiler.target>17</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>bom</artifactId> <version>2.20.17</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>s3</artifactId> </dependency> </dependencies>
ãµã³ãã«ããã°ã©ã ãæžã
ä»åçšæããããã°ã©ã ã¯ããã¡ãã
src/main/java/org/littlewings/aws/App.java
package org.littlewings.aws; import software.amazon.awssdk.auth.credentials.AwsBasicCredentials; import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider; import software.amazon.awssdk.awscore.defaultsmode.DefaultsMode; import software.amazon.awssdk.awscore.exception.AwsErrorDetails; import software.amazon.awssdk.awscore.exception.AwsServiceException; import software.amazon.awssdk.http.HttpStatusFamily; import software.amazon.awssdk.http.SdkHttpResponse; import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.s3.S3Client; import software.amazon.awssdk.services.s3.model.CreateBucketRequest; import software.amazon.awssdk.services.s3.model.CreateBucketResponse; import java.net.URI; public class App { public static void main(String... args) { try (S3Client s3Client = S3Client .builder() .credentialsProvider( StaticCredentialsProvider.create(AwsBasicCredentials.create("access_key_id", "secret_access_key")) ) .region(Region.AP_EAST_1) .defaultsMode(DefaultsMode.AUTO) .endpointOverride(URI.create("http://localhost:4566")) .forcePathStyle(true) .build()) { CreateBucketRequest request = CreateBucketRequest .builder() .bucket("my-bucket") .build(); CreateBucketResponse response = s3Client.createBucket(request); SdkHttpResponse httpResponse = response.sdkHttpResponse(); System.out.printf("isSuccessful = %b%n", httpResponse.isSuccessful()); System.out.printf("statusCode = %d%n", httpResponse.statusCode()); System.out.printf("httpStatusFamily = %s%n", HttpStatusFamily.of(httpResponse.statusCode())); } catch (AwsServiceException e) { AwsErrorDetails errorDetails = e.awsErrorDetails(); System.out.printf("serviceName = %s%n", errorDetails.serviceName()); System.out.printf("errorMessage = %s%n", errorDetails.errorMessage()); System.out.printf("errorCode = %s%n", errorDetails.errorCode()); SdkHttpResponse httpResponse = errorDetails.sdkHttpResponse(); System.out.printf("isSuccessful = %b%n", httpResponse.isSuccessful()); System.out.printf("statusCode = %d%n", httpResponse.statusCode()); System.out.printf("httpStatusFamily = %s%n", HttpStatusFamily.of(httpResponse.statusCode())); e.printStackTrace(); } } }
Amazon S3ãã±ãããäœæããã ãã®ããã°ã©ã ã§ãã
CreateBucketRequest request =
CreateBucketRequest
.builder()
.bucket("my-bucket")
.build();
CreateBucketResponse response = s3Client.createBucket(request);
ããšã¯ãã¬ã¹ãã³ã¹ã«å«ãŸããSdkHttpResponse
ã®å
容ãèŠããã
SdkHttpResponse httpResponse = response.sdkHttpResponse(); System.out.printf("isSuccessful = %b%n", httpResponse.isSuccessful()); System.out.printf("statusCode = %d%n", httpResponse.statusCode()); System.out.printf("httpStatusFamily = %s%n", HttpStatusFamily.of(httpResponse.statusCode()));
äŸå€ãã³ããªã³ã°ãè¡ã£ããã
} catch (AwsServiceException e) { AwsErrorDetails errorDetails = e.awsErrorDetails(); System.out.printf("serviceName = %s%n", errorDetails.serviceName()); System.out.printf("errorMessage = %s%n", errorDetails.errorMessage()); System.out.printf("errorCode = %s%n", errorDetails.errorCode()); SdkHttpResponse httpResponse = errorDetails.sdkHttpResponse(); System.out.printf("isSuccessful = %b%n", httpResponse.isSuccessful()); System.out.printf("statusCode = %d%n", httpResponse.statusCode()); System.out.printf("httpStatusFamily = %s%n", HttpStatusFamily.of(httpResponse.statusCode())); e.printStackTrace(); }
ã¹ããŒãããäŸå€ã¯AwsServiceException
ã¯ã©ã¹ã®ãµãã¯ã©ã¹ãªã®ã§ããã¡ãã§äžæ°ã«ææããããšã«ããŸãã
確èªããŠã¿ã
äœæããããã°ã©ã ãåãããŠã¿ãŸãããã
$ mvn compile exec:java -Dexec.mainClass=org.littlewings.aws.App
çµæã
isSuccessful = true statusCode = 200 httpStatusFamily = SUCCESSFUL
ãã1床å®è¡ãããšããã§ã«S3ãã±ããã¯äœæãããŠããã®ã§äŸå€ãã¹ããŒãããŸãã
$ mvn compile exec:java -Dexec.mainClass=org.littlewings.aws.App
ãããªæãã§ããã
serviceName = S3 errorMessage = Your previous request to create the named bucket succeeded and you already own it. errorCode = BucketAlreadyOwnedByYou isSuccessful = false statusCode = 409 httpStatusFamily = CLIENT_ERROR software.amazon.awssdk.services.s3.model.BucketAlreadyOwnedByYouException: Your previous request to create the named bucket succeeded and you already own it. (Service: S3, Status Code: 409, Request ID: 44425877V1D0A2F9, Extended Request ID: MzRISOwyjmnup2476E87BD8C5CA707/JypPGXLh0OVFGcJaaO3KW/hRAqKOpIEEp) 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:270) 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:171) 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:179) 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.createBucket(DefaultS3Client.java:1149) at org.littlewings.aws.App.main(App.java:36) at org.codehaus.mojo.exec.ExecJavaMojo$1.run(ExecJavaMojo.java:279) at java.base/java.lang.Thread.run(Thread.java:833)
ä»åã¯BucketAlreadyOwnedByYouException
ãã¹ããŒãããŸããã
software.amazon.awssdk.services.s3.model.BucketAlreadyOwnedByYouException: Your previous request to create the named bucket succeeded and you already own it. (Service: S3, Status Code: 409, Request ID: 44425877V1D0A2F9, Extended Request ID: MzRISOwyjmnup2476E87BD8C5CA707/JypPGXLh0OVFGcJaaO3KW/hRAqKOpIEEp)
äŸå€ã«å«ãŸããŠããAwsErrorDetails
ããåŸãããæ
å ±ã¯ãã¡ãã
serviceName = S3 errorMessage = Your previous request to create the named bucket succeeded and you already own it. errorCode = BucketAlreadyOwnedByYou
AwsErrorDetails
ããååŸã§ãããSdkHttpResponse
ã®æ
å ±ã¯ãã¡ãã
isSuccessful = false statusCode = 409 httpStatusFamily = CLIENT_ERROR
ãã®ã±ãŒã¹ã§ã¯SdkHttpResponse#isSuccessful
ãfalse
ã«ãªã£ãŠããŸãããããããHTTPã¹ããŒã¿ã¹ã³ãŒãã2xxã®å Žåã«true
ã«ãªã
ããããã£ã§ããããã
If we get back any 2xx status code, then we know we should treat the service call as successful.
ãšããããã§ãSdkHttpResponse#isSuccessful
ãfalse
ã«ãªãã±ãŒã¹ã§ã¯ãã¯ãäŸå€ãã¹ããŒãããæ°ãããŸãã
å®è£ ã¯ïŒ
å°ããå®è£
ãèŠãŠã¿ãŸããããS3Client
ã€ã³ã¿ãŒãã§ãŒã¹ã®å®è£
ã¯ã©ã¹ãå°ãèŠãŠã¿ãŸãã
$ unzip -p $HOME/.m2/repository/software/amazon/awssdk/s3/2.20.17/s3-2.20.17-sources.jar software/amazon/awssdk/services/s3/DefaultS3Client.java
ãããªæãã§ããšã©ãŒã³ãŒããšäŸå€ããããã³ã°ãããŠããç®æããããŸããã
private AwsS3ProtocolFactory init() { return AwsS3ProtocolFactory .builder() .registerModeledException( ExceptionMetadata.builder().errorCode("NoSuchUpload") .exceptionBuilderSupplier(NoSuchUploadException::builder).build()) .registerModeledException( ExceptionMetadata.builder().errorCode("ObjectAlreadyInActiveTierError") .exceptionBuilderSupplier(ObjectAlreadyInActiveTierErrorException::builder).build()) .registerModeledException( ExceptionMetadata.builder().errorCode("BucketAlreadyExists") .exceptionBuilderSupplier(BucketAlreadyExistsException::builder).build()) .registerModeledException( ExceptionMetadata.builder().errorCode("NoSuchBucket") .exceptionBuilderSupplier(NoSuchBucketException::builder).build()) .registerModeledException( ExceptionMetadata.builder().errorCode("InvalidObjectState") .exceptionBuilderSupplier(InvalidObjectStateException::builder).build()) .registerModeledException( ExceptionMetadata.builder().errorCode("ObjectNotInActiveTierError") .exceptionBuilderSupplier(ObjectNotInActiveTierErrorException::builder).build()) .registerModeledException( ExceptionMetadata.builder().errorCode("BucketAlreadyOwnedByYou") .exceptionBuilderSupplier(BucketAlreadyOwnedByYouException::builder).build()) .registerModeledException( ExceptionMetadata.builder().errorCode("NoSuchKey").exceptionBuilderSupplier(NoSuchKeyException::builder) .build()).clientConfiguration(clientConfiguration) .defaultServiceExceptionSupplier(S3Exception::builder).build(); }
å
ã»ã©ã®ãµã³ãã«ã¢ããªã±ãŒã·ã§ã³ã§S3ãã±ããã®äœæå€±ææã«ãAwsErrorDetails
ããåŸããããšã©ãŒã³ãŒãã¯BucketAlreadyOwnedByYou
ãªã®ã§ããã¡ãã該åœããŸããã
.registerModeledException(
ExceptionMetadata.builder().errorCode("BucketAlreadyOwnedByYou")
.exceptionBuilderSupplier(BucketAlreadyOwnedByYouException::builder).build())
ãããã³ã°ããããšã©ãŒã³ãŒãããªãå Žåã¯ãS3Exception
ãã¹ããŒãããããã«èŠããŸãã
.defaultServiceExceptionSupplier(S3Exception::builder).build();
ããèŠããšãS3Client#createBucket
ã®throws
ã«æžãããŠããå
容ãããã£ãŠããŸããã
default CreateBucketResponse createBucket(CreateBucketRequest createBucketRequest) throws BucketAlreadyExistsException, BucketAlreadyOwnedByYouException, AwsServiceException, SdkClientException, S3Exception
ãšã©ãŒã³ãŒãããããã³ã°ã§ããå Žåã¯BucketAlreadyExistsException
ãBucketAlreadyOwnedByYouException
ããã以å€ã¯
S3Exception
ãAwsServiceException
ãããããAPIåŒã³åºããã§ããªãã£ãå Žåã¯SdkClientException
ãšããæãã§ããã
S3AsyncClient
ã®å®è£
ãèŠãŠã¿ãŸããããåãæãã§ããã
$ unzip -p $HOME/.m2/repository/software/amazon/awssdk/s3/2.20.17/s3-2.20.17-sources.jar software/amazon/awssdk/services/s3/DefaultS3AsyncClient.java
ãã¡ãã§ããã
private AwsS3ProtocolFactory init() { return AwsS3ProtocolFactory .builder() .registerModeledException( ExceptionMetadata.builder().errorCode("NoSuchUpload") .exceptionBuilderSupplier(NoSuchUploadException::builder).build()) .registerModeledException( ExceptionMetadata.builder().errorCode("ObjectAlreadyInActiveTierError") .exceptionBuilderSupplier(ObjectAlreadyInActiveTierErrorException::builder).build()) .registerModeledException( ExceptionMetadata.builder().errorCode("BucketAlreadyExists") .exceptionBuilderSupplier(BucketAlreadyExistsException::builder).build()) .registerModeledException( ExceptionMetadata.builder().errorCode("NoSuchBucket") .exceptionBuilderSupplier(NoSuchBucketException::builder).build()) .registerModeledException( ExceptionMetadata.builder().errorCode("InvalidObjectState") .exceptionBuilderSupplier(InvalidObjectStateException::builder).build()) .registerModeledException( ExceptionMetadata.builder().errorCode("ObjectNotInActiveTierError") .exceptionBuilderSupplier(ObjectNotInActiveTierErrorException::builder).build()) .registerModeledException( ExceptionMetadata.builder().errorCode("BucketAlreadyOwnedByYou") .exceptionBuilderSupplier(BucketAlreadyOwnedByYouException::builder).build()) .registerModeledException( ExceptionMetadata.builder().errorCode("NoSuchKey").exceptionBuilderSupplier(NoSuchKeyException::builder) .build()).clientConfiguration(clientConfiguration) .defaultServiceExceptionSupplier(S3Exception::builder).build(); }
ãšããã§ãAWS SDK for Java 2.xã®GitHubãªããžããªãèŠãŠãããããã®ã¯ã©ã¹ã¯ååšããŸããã
GitHub - aws/aws-sdk-java-v2: The official AWS SDK for Java - Version 2
ãªã¯ãšã¹ããã¬ã¹ãã³ã¹ãŸããã®ã¯ã©ã¹ã®é°å²æ°ããããªããšãªãå¯ããã€ããŸããããããã®ã¯ã©ã¹ã¯èªåçæãªæããããŸããã
@Generated("software.amazon.awssdk:codegen") @SdkInternalApi final class DefaultS3Client implements S3Client { ... @Generated("software.amazon.awssdk:codegen") public final class CreateBucketResponse extends S3Response implements ... @Generated("software.amazon.awssdk:codegen") public final class BucketAlreadyOwnedByYouException extends S3Exception implements ToCopyableBuilder<BucketAlreadyOwnedByYouException.Builder, BucketAlreadyOwnedByYouException> {
ããã§ã¯ããã®ãããã¯è¿œããŸãããã
æ°ã«ããã®ã¯ãå ã»ã©ã®ã¹ã¿ãã¯ãã¬ãŒã¹ã§åºçŸããŠãããã®ãããããªãšã
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:270
BaseClientHandler
ã§ã¬ã¹ãã³ã¹ã®ãã³ããªã³ã°ãè¡ã£ãŠããç®æã¯ããã¡ããAPIåŒã³åºããæåããå Žåã¯ãResponse
å
ã«
SdkHttpResponse
ãªã©ãå«ãŸããããšã«ãªããŸãã
Response<OutputT> delegateResponse = responseHandler.handle(response, executionAttributes);
ãããŠãAPIã®åŒã³åºãçµæãæåïŒå€±æã«ããåå²ã
if (parsedResponse.isResponseSuccess()) { OutputT response = handleSuccessResponse(parsedResponse); return Response.<OutputT>builder().httpResponse(httpResponse) .response(response) .isSuccess(true) .build(); } else { return Response.<OutputT>builder().httpResponse(httpResponse) .exception(handleErrorResponse(parsedResponse)) .isSuccess(false) .build(); }
handleErrorResponse
ã¡ãœããã§ã¯ãå®éã«ã¹ããŒãããäŸå€ãäœæãããŸããSdkException
ã®éšåã§ããã
SdkException exception = errorResponseTransformer.apply(parsedResponse);
exception.fillInStackTrace();
return exception;
ãšã©ãŒã³ãŒããããäŸå€ã«å€æããŠããã®ã¯ä»¥äžã®ç®æã®ããã§ããäžèŽãããã®ããªãã£ãå Žåã¯ãããã©ã«ãã®äŸå€ãéžæããã
ããã§ãã
AwsServiceException.Builder builder = errorRoot
.map(e -> invokeSafely(() -> unmarshallFromErrorCode(response, e, errorCode)))
.orElseGet(this::defaultException);
ãããŠããã®äŸå€ãã¹ããŒãããããšã«ãªãããšããããã§ããã
ããšã¯ãå
ã»ã©ã®ä»¥äžã®åå²ã§true
ïŒfalse
ã«ãªãæ
å ±ãèŠããšè¯ãããã§ãã
if (parsedResponse.isResponseSuccess()) { OutputT response = handleSuccessResponse(parsedResponse); return Response.<OutputT>builder().httpResponse(httpResponse) .response(response) .isSuccess(true) .build(); } else { return Response.<OutputT>builder().httpResponse(httpResponse) .exception(handleErrorResponse(parsedResponse)) .isSuccess(false) .build(); }
ããã¯ã以äžã®éšåã§ããã
if (!context.sdkHttpFullResponse().isSuccessful()) { // Request was non-2xx, defer to protocol handler for error root Optional<XmlElement> parsedErrorXml = parsedRootXml.flatMap(errorRootLocationFunction); return context.toBuilder().isResponseSuccess(false).parsedErrorXml(parsedErrorXml.orElse(null)).build(); }
ããã§SdkHttpFullReponse
ãšããã®ã¯ãSdkHttpResponse
ã€ã³ã¿ãŒãã§ãŒã¹ãæ¡åŒµãããã®ã§ãã
SdkHttpFullResponse (AWS SDK for Java - 2.20.17)
ãšããããšã¯ãSdkHttpFullReponse#isSuccessful
ãfalse
ã®æã«äŸå€ãã¹ããŒãããããšã«ãªãã®ã§ãæ£åžžã«APIåŒã³åºããå®äºããå Žåã¯
SdkHttpResponse#isSuccessful
ã¯true
ã«ãªããfalse
ã«ãªãã±ãŒã¹ã§ã¯äŸå€ãã¹ããŒãããããšã«ãªããŸãã
ãªã®ã§ãAWS SDK for Java 2.xã®äŸå€åŠçã§ã¯SdkHttpResponse#isSuccessful
ã®è©±ã¯åºãŠããªãããšãªãããã§ãã
AWS SDK for Java 2.x の例外処理 - AWS SDK for Java 2.x
å®è¡ãã¹ãå šéšèŠãããšãããšããããããã§ããªãã®ã§ãããèãæ¹ãšããŠã¯ãããªã«èª€ã£ãŠããªããšæãã®ã§ããâŠã©ãã§ãããïŒ
ãªããAPIåŒã³åºããæ£åžžã«ã§ããå Žåã«ã¬ã¹ãã³ã¹ã®ãªããžã§ã¯ããèŠãªãã§ããããšãããšãã¬ã¹ãã³ã¹ããåŸããæ
å ±ã¯API次第ããš
æããŸãïŒåŒã³åºãçµæã®å€ã«é¢å¿ããããã©ããïŒã
ãŸãšã
AWS SDK for Java 2.xã®SdkHttpResponse#isSuccessful
ãæ°ã«ãªã£ãã®ã§ãã¡ãã£ãšç¢ºèªããŠã¿ãŸããã
äŸå€ãã¹ããŒããããã©ããã«å ããŠãSdkHttpResponse#isSuccessful
ãèŠãå¿
èŠããããã©ããã§è¿·ã£ãŠããã®ã§ãããããã¯ã©ããã
ã¹ã«ãŒããŠè¯ãããã§ãã
ã¬ã¹ãã³ã¹ã®ãªããžã§ã¯ãããã¯ãAPIåŒã³åºããæ£åžžã«çµäºããå Žåã«æ¬²ããæ å ±ãååŸããã®ã«äœ¿ãæãã§ããã