0

我正在使用 RestTemplate 从我的另一个 Web 服务调用我的 Web 服务的运行状况执行器端点,以查看 Web 服务是否已启动。如果 web 服务启动,一切正常,但当它关闭时,我收到错误 500,“内部服务器错误”。如果我的网络服务已关闭,我会尝试捕获该错误以便能够处理它,但我遇到的问题是我似乎无法捕获该错误。

我尝试了以下方法,但它从未进入我的任何一个捕获部分

@Service
public class DepositService {

  @Bean
  public RestTemplate restTemplate(RestTemplateBuilder builder) {
    return builder
            .setConnectTimeout(Duration.ofMillis(3000))
            .setReadTimeout(Duration.ofMillis(3000))
            .build();
  }

  private static void getBankAccountConnectorHealth() {
    final String uri = "http://localhost:9996/health";

    RestTemplate restTemplate = new RestTemplate();

    String result = null;

    try {
      result = restTemplate.getForObject(uri, String.class);
    } catch (HttpClientErrorException exception) {
      System.out.println("callToRestService Error :" + exception.getResponseBodyAsString());
    } catch (HttpStatusCodeException exception) {
      System.out.println( "callToRestService Error :" + exception.getResponseBodyAsString());
    }

    System.out.println(result);
  }

}

我也试过这样做,但结果相同。它似乎永远不会进入我的错误处理程序类。

public class NotFoundException extends RuntimeException {
}

public class RestTemplateResponseErrorHandler implements ResponseErrorHandler {

  @Override
  public boolean hasError(ClientHttpResponse httpResponse) throws IOException {
    return (httpResponse.getStatusCode().series() == CLIENT_ERROR || httpResponse.getStatusCode().series() == SERVER_ERROR);
  }

  @Override
  public void handleError(ClientHttpResponse httpResponse) throws IOException {
    if (httpResponse.getStatusCode().series() == HttpStatus.Series.SERVER_ERROR) {
      // handle SERVER_ERROR
      System.out.println("Server error!");
    } else if (httpResponse.getStatusCode().series() == HttpStatus.Series.CLIENT_ERROR) {
      // handle CLIENT_ERROR
      System.out.println("Client error!");

      if (httpResponse.getStatusCode() == HttpStatus.NOT_FOUND) {
        throw new NotFoundException();
      }
    }
  }



}

@Service
public class DepositService {

  @Bean
  public RestTemplate restTemplate(RestTemplateBuilder builder) {
    return builder
            .setConnectTimeout(Duration.ofMillis(3000))
            .setReadTimeout(Duration.ofMillis(3000))
            .build();
  }

  private static void getAccountHealth() {
    final String uri = "http://localhost:9996/health";

    RestTemplate restTemplate = new RestTemplate();
    restTemplate.setErrorHandler(new RestTemplateResponseErrorHandler());

    String result = null;

    result = restTemplate.getForObject(uri, String.class);

    System.out.println(result);
  }

}

关于如何从另一个 Web 服务调用我的 Web 服务的健康执行器并捕获该 Web 服务是否关闭的任何建议?

4

2 回答 2

0

看起来getForObject不会抛出您正在捕获的任何异常。从文档中,它抛出RestClientException。我发现识别抛出异常的最佳方法是Exception在调试器中捕获并检查它是否有用。

使用第二种方法,我不确定您为什么要为 . 创建一个 bean 方法,RestTemplate然后使用new. 您可能应该注入您的并使用该方法RestTemplate初始化。ResponseErrorHandlerRestTemplateBuilder::errorHandler

于 2020-12-11T05:04:45.077 回答
0

内部服务错误抛出HttpServerErrorException如果您想处理它,您应该捕获此异常但是更好的方法是使用错误处理程序,您可以查看以下帖子以了解如何执行此操作:

  1. 弹簧休息模板错误处理

  2. spring-boot-resttemplate-错误处理

于 2020-12-11T05:10:18.993 回答