Springboot Interservices通信异常处理

时间:2020-01-25 04:16:04

标签: rest spring-boot exception

我有一个正在调用另一个服务B的微服务A。我正在尝试使用@ExceptionHandler处理错误消息。

我想将从B接收到的错误消息传播到服务A。,但是在其余的调用响应中,它给出了HttpStatus代码,但没有body(空)。下面是快照:

Exception snapshot

以下是邮递员服务B的答复。我想在服务A中得到相同的错误响应消息。

Postman response

以下是我的代码:

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;
    }

对此表示感谢。 干杯!

1 个答案:

答案 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());
    }
}