我正在使用restemplate从我的另一个web服务调用我的web服务的健康执行器端点,以查看web服务是否启动。如果webservice启动,一切正常,但是当它关闭时,我得到一个错误500,“内部服务器错误”。如果我的webservice关闭了,我会尝试捕捉错误以处理它,但是我遇到的问题是我似乎无法捕捉错误。
我试过以下方法,但它从未进入我的任何一个捕获区
@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服务是否关闭,有什么建议吗?
2条答案
按热度按时间1hdlvixo1#
看起来像是
getForObject
不会抛出正在捕获的任何异常。从文件上看RestClientException
. 我找到的识别抛出异常的最佳方法是捕获Exception
并检查它是否有用。对于第二个方法,我不知道为什么要为
RestTemplate
然后用new
. 你应该注射你的RestTemplate
并初始化ResponseErrorHandler
与RestTemplateBuilder::errorHandler
方法。f4t66c6m2#
内部发球失误
HttpServerErrorException
如果您想处理这个异常,您应该捕获它,但是更好的方法是使用错误处理程序,您可以看到下面的文章来了解如何做到这一点:spring rest模板错误处理
spring引导模板错误处理