【问题标题】:How to throw same exception thrown by external endpoint in springboot如何在spring boot中抛出外部端点抛出的相同异常
【发布时间】:2019-05-20 14:04:47
【问题描述】:

我正在访问一个外部 api,我希望得到一个图像作为响应 (byte[])。我连接到此端点的方法如下所示:

 private byte[] retrieveImage(String uri) {
     byte[] imageBytes = null;
     try {
            URL url = new URL(uri);
            BufferedImage bufferedImage = ImageIO.read(url);
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            ImageIO.write(image, "png", baos);
            imageBytes = baos.toByteArray();
        } catch (Exception ex) {
            throw new ImageNotReadException(ex.getLocalizedMessage());
        }
        return imageBytes;
    }

事实证明,如果我将错误的参数传递给目标端点,我会收到以下错误消息:

所以基本上我想throw 上面相同的错误,但我也想throwImageNotReadException (java.lang.IllegalArgumentException: image == null!),以防程序无法读取图像 (byte[])。所以基本上,我的方法private byte[] retrieveImage(String uri) 将不得不抛出我的读取图像异常和端点响应异常。

有什么建议吗? 感谢您的帮助!

【问题讨论】:

  • 如果你想抛出同样的异常,只需输入:throw ex;
  • 我该怎么做?它是一个外部 api,如果一切正常,它会返回一个图像 (byte[]),如果有错误,它会返回 {"error": {"code":400, :"Invalid 'layersDefs'", "details":[] }}。不知道如何处理。
  • 你的问题不清楚!你想在哪里处理响应?在您的 Java 代码中还是在浏览器中?
  • 您正在“捕获”一个 HTTP 响应代码并想要抛出一个内部错误,或者向您的服务客户端返回相同的响应?再次,相当不清楚你想做什么。假设您想要解析非 200 响应代码并将它们传递——这通常不是最好的方法——你会这样做:从你的调用中获取响应到外部系统,检查它是否成功(2xx ),如果没有,请将其用作您自己的 Response 对象。完成。
  • 如果您的客户可以灵活地更改返回类型,您可以轻松更改自定义对象类型的返回类型,其中包含状态码和 byte[] 作为属性(例如:Response),然后返回相关。或者您可以更改方法签名以抛出您自己的异常,并且您可以在外部 api 返回错误时显式抛出该异常。

标签: java spring rest spring-boot exception


【解决方案1】:

正如我所评论的,请参阅以下选项

private Response retrieveImage(String uri) {
     byte[] imageBytes = null;
Response r=new Response();
     try {
            URL url = new URL(uri);
            BufferedImage bufferedImage = ImageIO.read(url);
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            ImageIO.write(image, "png", baos);
            imageBytes = baos.toByteArray();
            r.setImage(imageBytes);
            r.setStatus(1);
        } catch (Exception ex) {
            r.setStatus(0);
        }
        return r;
    }

回应:

class Response{ 
String status;
byte[] image;

//getters setters
}

或者:

  private Response retrieveImage(String uri)throws CustomException {
         byte[] imageBytes = null;
         try {
                URL url = new URL(uri);
                BufferedImage bufferedImage = ImageIO.read(url);
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                ImageIO.write(image, "png", baos);
                imageBytes = baos.toByteArray();
            } catch (Exception ex) {
                throw new CustomException(ex.getLocalizedMessage());
            }
            return imageBytes;
        }

【讨论】:

  • 非常感谢@sampathpremarathna。我想这就是我需要的。为帮助队友干杯! :)
猜你喜欢
  • 2020-02-05
  • 2016-09-26
  • 2019-09-19
  • 1970-01-01
  • 1970-01-01
  • 2019-01-24
  • 2018-06-02
  • 1970-01-01
  • 2021-01-15
相关资源
最近更新 更多