假设有两个服务Consumer与Provider,在Spring Boot框架中,Consumer服务通过Feign方式调用Provider服务。
在Provider服务中进行通用异常处理,代码如下:
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(value = ServiceException.class)
public ResponseEntity handleServiceException(ServiceException e) {
return new ResponseEntity(new InnerResult(e.getErrCode(), e.getErrMsg()),
HttpStatus.INTERNAL_SERVER_ERROR);
}
@ExceptionHandler(value = Exception.class)
public ResponseEntity handleException(Exception e) {
InnerResult innerResult = new InnerResult(500, "系统异常");
return new ResponseEntity(innerResult, HttpStatus.INTERNAL_SERVER_ERROR);
}
}
其中ServiceException是自定义的异常类,InnerResult是自定义的对象,用来承载返回的错误码与错误信息。
在Consumer服务中配置Feign的异常处理,代码如下:
public class CommonFeignErrorDecoder extends ErrorDecoder.Default {
@Override
public Exception decode(String methodKey, Response response) {
try {
String result = Util.toString(response.body().asReader(Charset.defaultCharset()));
InnerResult innerResult = JsonUtil.fromJsonString(result, InnerResult.class);
return new ServiceException(innerResult.getCode(), innerResult.getMsg());
} catch (Exception e) {
return new ServiceException("系统繁忙,请稍后重试");
}
}
}
这里面干的事情就是将返回的异常码与异常信息,重新组装成异常类ServiceException。