首页 > 解决方案 > Web 服务能否从不同服务器上的 Web 服务获取自定义错误消息?

问题描述

我在服务器 A 上运行了一个 Web 服务,它在 Java ResponseEntity 对象中返回一条自定义错误消息,如下所示:

return new ResponseEntity<String>("My custom error message.", HttpStatus.BAD_REQUEST);

我在服务器 B 上运行了另一个 Web 服务,它调用服务器 A 上的 Web 服务,但不是“我的自定义错误消息”,而是得到以下信息:

无法解析 JSON。原始结果:服务器返回 HTTP 响应代码:400

如果我直接调用服务器 A 上的 Web 服务,那么我会得到一个错误 400,并按预期显示“我的自定义错误消息”。

我已将问题隔离到服务器 B 尝试读取服务器 A 的响应时。

BufferedReader br = new BufferedReader(new InputStreamReader((conn.getInputStream())));

当服务器 B 从服务器 A 收到错误 400 时,conn.getInputStream() 会抛出一个 IOException,该异常被捕获,但“我的自定义错误消息”在异常中丢失。

catch (IOException e) {
    return new ResponseEntity<String>(e.getMessage(), HttpStatus.BAD_REQUEST);
}

服务器 B 是否可以从服务器 A 返回自定义错误消息?怎么做到呢?

我正在使用 Java 8、Spring Boot 2.0.2、Tomcat 9 和 Swagger UI 2.8 来测试 Web 服务。

更新:如果服务器 A 返回代码 200 而不是 400,则不会在服务器 B 上抛出 IOException。而是抛出 JsonParseException 并且服务器 B 返回“我的自定义错误消息”。

标签: javaspring-boot

解决方案


我认为发生这种情况的原因是您的异常虽然从 A 正确抛出,但在内部处理conn.getInputStream了 BAD_REQUEST 异常。我可以猜到的一种可能的解决方案是,您在使输入流读取器的对象检查天气连接之前以某种方式检查是否引发了一些异常。

try{
    conn.open();
    BufferedReader br = new BufferedReader(new InputStreamReader((conn.getInputStream()));
    }catch(Exception e){
     return new ResponseEntity<String>(e.getMessage(), HttpStatus.BAD_REQUEST);
}

类似于 conn.open 的方法应该在生成输入流读取器对象之前抛出您的自定义异常


推荐阅读