【问题标题】:How to handle 404 error for amazon s3 bucket in my spring boot code如何在我的 Spring Boot 代码中处理 amazon s3 存储桶的 404 错误
【发布时间】:2019-12-03 13:59:37
【问题描述】:

我的 spring-boot 应用程序中实际上有一个问题我开发了一个链接到一个 s3 存储桶的 restful api 我已经自定义了一些异常但是当我运行我的 url 来获取一个在控制台中不存在的对象时我看到我的控制台中出现此错误异常:

2019-07-25 09:06:45.733 错误 1 ​​--- [-nio-443-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] :Servlet.service() for 带有路径 [] 的上下文中的 servlet [dispatcherServlet] 引发异常 [请求处理失败;嵌套异常是 com.amazonaws.services.s3.model.AmazonS3Exception:指定的键 不存在。 (服务:Amazon S3;状态代码:404;错误代码: NoSuchKey;请求编号:60E24BCF6860FC66; S3 扩展请求 ID: DUEnMWN7YZKug74Q15uHt4Zei3+a7SxTNYzoj99O0YW58WOwvkdM1kwYpcHrGJiTrLkRLOdUL5I=), S3 扩展请求 ID: DUEnMWN7YPOAIZADg74Q15uHt4Zei3+a7SxTNYzoj99O0YW58WOwvkdM1kwYpcHrGJiTrLkRLOdUL5I=] 有根本原因

com.amazonaws.services.s3.model.AmazonS3Exception:指定的键 不存在。 (服务:Amazon S3;状态代码:404;错误代码: NoSuchKey;请求编号:60E24BCF6860FC66; S3 扩展请求 ID: DUEnMWN7YZKug74Q15uHt4ZDFSFSQSDei3+a7SxTNYzoj99O0YW58WOwvkdM1kwYpcHrGJiTrLkRLOdUL5I=)

所以我的问题是如何在 2 点上对这个错误进行自定义:

  1. 控制台中没有显示此错误(从技术上讲,我不是指更改日志参数)
  2. 用一些方法处理这个异常

【问题讨论】:

    标签: java spring amazon-web-services spring-boot amazon-s3


    【解决方案1】:

    编写自定义异常处理程序来捕获您的异常并做一些优雅的事情。

    @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);
        }
    }
    

    这里,UNPROCESSABLE_ENTITYHttpStatus (org.springframework.http.HttpStatus)

    请根据您的要求更改方法handleAmazonS3Exception(...)的代码。

    【讨论】:

    • 感谢您的快速回答,我有一个 ResponseEntity 作为返回类型,我该如何管理?
    • 我测试过,它可以工作,谢谢我只是添加了一个 Api 类并执行 @ControllerAdvice 。感谢您的帮助
    【解决方案2】:

    如果您想完全避免异常,您可以在尝试下载之前使用 Aws s3 api 查看对象是否存在。我认为方法是doesObjectExist。但是,如果您无论如何要下载该文件以防万一它存在,这似乎有点过头了。 所以你可以放一个try-catch,如果你最终捕捉到AmazonS3Exception,那么检查状态码并做相应的事情。

    【讨论】:

    • 尝试,当您需要自定义错误消息时需要捕获,如果需要的位置较少。否则,最好让它在全球范围内处理。不仅对象存在,文件未找到。当 s3 操作失败时,我们也需要显示错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-03
    • 2023-04-10
    • 2013-10-23
    • 2021-06-09
    • 1970-01-01
    • 2016-08-25
    相关资源
    最近更新 更多