简体   繁体   中英

How to handle 404 error for amazon s3 bucket in my spring boot code

I have actually a problem within my spring-boot application i developed a restful api linked to an s3 bucket i've customized some exceptions but when i run my url to get an object that doesn't exsit in the console i saw this error exception in my console :

2019-07-25 09:06:45.733 ERROR 1 --- [-nio-443-exec-1] oaccC[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is com.amazonaws.services.s3.model.AmazonS3Exception: The specified key does not exist. (Service: Amazon S3; Status Code: 404; Error Code: NoSuchKey; Request ID: 60E24BCF6860FC66; S3 Extended Request ID: DUEnMWN7YZKug74Q15uHt4Zei3+a7SxTNYzoj99O0YW58WOwvkdM1kwYpcHrGJiTrLkRLOdUL5I=), S3 Extended Request ID: DUEnMWN7YPOAIZADg74Q15uHt4Zei3+a7SxTNYzoj99O0YW58WOwvkdM1kwYpcHrGJiTrLkRLOdUL5I=] with root cause

com.amazonaws.services.s3.model.AmazonS3Exception: The specified key does not exist. (Service: Amazon S3; Status Code: 404; Error Code: NoSuchKey; Request ID: 60E24BCF6860FC66; S3 Extended Request ID: DUEnMWN7YZKug74Q15uHt4ZDFSFSQSDei3+a7SxTNYzoj99O0YW58WOwvkdM1kwYpcHrGJiTrLkRLOdUL5I=)

So my question is how to perform customization to this error in 2 points:

  1. Not having this error showing in the console (technically I don't mean change log parameters)
  2. Handle this exception with some methods

Write custom exception handler to capture your exceptions and do graceful things.

@ControllerAdvice
@RestController
public class CustomExceptionHandler extends ResponseEntityExceptionHandler {

    @ExceptionHandler(AmazonS3Exception.class)
    public final ResponseEntity<Object> handleAmazonS3Exception(AmazonS3Exception ex, WebRequest request) {
        ApiError apiError = new ApiError(UNPROCESSABLE_ENTITY, ex.getLocalizedMessage(), ex.getErrors());
        return new ResponseEntity<>(apiError, UNPROCESSABLE_ENTITY);
    }
}

Here, UNPROCESSABLE_ENTITY is a HttpStatus ( org.springframework.http.HttpStatus )

Please change the code of method handleAmazonS3Exception(...) based on your requirement.

If you want to avoid the exception completely, you can use the Aws s3 api to see if the object exists or not before trying to download it. I think the method is doesObjectExist . But seems like overkill if you anyway are going to download the file in case it exists. So you can put a try-catch and if you end up catching AmazonS3Exception then check the status code and do stuff accordingly.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM