使用resttemplate getforobject时无法捕获错误

ruoxqz4g  于 2021-07-06  发布在  Java
关注(0)|答案(2)|浏览(752)

我正在使用restemplate从我的另一个web服务调用我的web服务的健康执行器端点,以查看web服务是否启动。如果webservice启动,一切正常,但是当它关闭时,我得到一个错误500,“内部服务器错误”。如果我的webservice关闭了,我会尝试捕捉错误以处理它,但是我遇到的问题是我似乎无法捕捉错误。
我试过以下方法,但它从未进入我的任何一个捕获区

  1. @Service
  2. public class DepositService {
  3. @Bean
  4. public RestTemplate restTemplate(RestTemplateBuilder builder) {
  5. return builder
  6. .setConnectTimeout(Duration.ofMillis(3000))
  7. .setReadTimeout(Duration.ofMillis(3000))
  8. .build();
  9. }
  10. private static void getBankAccountConnectorHealth() {
  11. final String uri = "http://localhost:9996/health";
  12. RestTemplate restTemplate = new RestTemplate();
  13. String result = null;
  14. try {
  15. result = restTemplate.getForObject(uri, String.class);
  16. } catch (HttpClientErrorException exception) {
  17. System.out.println("callToRestService Error :" + exception.getResponseBodyAsString());
  18. } catch (HttpStatusCodeException exception) {
  19. System.out.println( "callToRestService Error :" + exception.getResponseBodyAsString());
  20. }
  21. System.out.println(result);
  22. }
  23. }

我也试过这样做,但效果一样。它似乎从未进入我的错误处理程序类。

  1. public class NotFoundException extends RuntimeException {
  2. }
  3. public class RestTemplateResponseErrorHandler implements ResponseErrorHandler {
  4. @Override
  5. public boolean hasError(ClientHttpResponse httpResponse) throws IOException {
  6. return (httpResponse.getStatusCode().series() == CLIENT_ERROR || httpResponse.getStatusCode().series() == SERVER_ERROR);
  7. }
  8. @Override
  9. public void handleError(ClientHttpResponse httpResponse) throws IOException {
  10. if (httpResponse.getStatusCode().series() == HttpStatus.Series.SERVER_ERROR) {
  11. // handle SERVER_ERROR
  12. System.out.println("Server error!");
  13. } else if (httpResponse.getStatusCode().series() == HttpStatus.Series.CLIENT_ERROR) {
  14. // handle CLIENT_ERROR
  15. System.out.println("Client error!");
  16. if (httpResponse.getStatusCode() == HttpStatus.NOT_FOUND) {
  17. throw new NotFoundException();
  18. }
  19. }
  20. }
  21. }
  22. @Service
  23. public class DepositService {
  24. @Bean
  25. public RestTemplate restTemplate(RestTemplateBuilder builder) {
  26. return builder
  27. .setConnectTimeout(Duration.ofMillis(3000))
  28. .setReadTimeout(Duration.ofMillis(3000))
  29. .build();
  30. }
  31. private static void getAccountHealth() {
  32. final String uri = "http://localhost:9996/health";
  33. RestTemplate restTemplate = new RestTemplate();
  34. restTemplate.setErrorHandler(new RestTemplateResponseErrorHandler());
  35. String result = null;
  36. result = restTemplate.getForObject(uri, String.class);
  37. System.out.println(result);
  38. }
  39. }

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

1hdlvixo

1hdlvixo1#

看起来像是 getForObject 不会抛出正在捕获的任何异常。从文件上看 RestClientException . 我找到的识别抛出异常的最佳方法是捕获 Exception 并检查它是否有用。
对于第二个方法,我不知道为什么要为 RestTemplate 然后用 new . 你应该注射你的 RestTemplate 并初始化 ResponseErrorHandlerRestTemplateBuilder::errorHandler 方法。

f4t66c6m

f4t66c6m2#

内部发球失误 HttpServerErrorException 如果您想处理这个异常,您应该捕获它,但是更好的方法是使用错误处理程序,您可以看到下面的文章来了解如何做到这一点:
spring rest模板错误处理
spring引导模板错误处理

相关问题