我有一个正在调用另一个服务B的微服务A。我正在尝试使用@ExceptionHandler
处理错误消息。
我想将从B接收到的错误消息传播到服务A。,但是在其余的调用响应中,它给出了HttpStatus代码,但没有body(空)。下面是快照:
以下是邮递员服务B的答复。我想在服务A中得到相同的错误响应消息。
以下是我的代码:
RestServiceCall.java
public List<AccessResponse> daxObjectAccessibilitycall(AccessDataObject requestEntity) {
ResponseEntity<AccessResponse[]> responseEntity = restTemplate.postForEntity(getFullPathService(), requestEntity, AccessResponse[].class);
if (responseEntity == null) {
return Collections.emptyList();
}
AccessResponse[] accessResponse = responseEntity.getBody();
return Arrays.asList(accessResponse);
}
在错误处理过程中,它引发一个异常,该异常在以下代码中进行处理:
public boolean myFoo(MyDto){
.
.
.
try {
myObjectAccessibilitycall = serviceCall.objectAccessibilitycall(accessDataObj);
} catch (RestClientException e) {
logger.error("Error while getting response from Accessibility", e);
throw new myException("Error: ", e);
}
if (!CollectionUtils.isEmpty(myObjectAccessibilitycall )) {
for (AccessResponse accessResponse : myObjectAccessibilitycall ) {
accessFlag = accessResponse.isResponseMsg();
}
}
return accessFlag;
}
对此表示感谢。 干杯!
答案 0 :(得分:2)
有两个选项 1.使用@ControllerAdvice处理异常。下面我们处理IllegalArgumentException和IllegalStateException异常。就像你需要处理HttpClientErrorException
@ControllerAdvice
public class RestResponseEntityExceptionHandler
extends ResponseEntityExceptionHandler {
@ExceptionHandler(value
= { IllegalArgumentException.class, IllegalStateException.class })
protected ResponseEntity<Object> handleConflict(
RuntimeException ex, WebRequest request) {
String bodyOfResponse = "This should be application specific";
return handleExceptionInternal(ex, bodyOfResponse,
new HttpHeaders(), HttpStatus.CONFLICT, request);
}
}
选项2。您可以捕获RestClientResponseException
<T> ResponseEntity consumeWebService(String url, Class<T> responseType) {
try {
return restTemplate.getForEntity(url, responseType);
} catch (RestClientResponseException e) {
return ResponseEntity
.status(e.getRawStatusCode())
.body(e.getResponseBodyAsString());
}
}