一、定義一個通用的Result類
目的是保證整個系統有一個通用的響應對象,這樣統一處理會比較方便
public class Result<T> implements Serializable{
private boolean success = true;//業務是否處理成功
private String code;//業務處理的錯誤碼
private String message;//業務處理的描述信息
private T data; // 真實的業務結果對象
public static <T> Result<T> create() {
return new Result<T>();
}
public static <T> Result<T> success(T data) {
Result<T> result = new Result<T>();
result.setData(data);
return result;
}
public Result<T> error(String code, String message) {
this.setSuccess(false);
this.setCode(code);
this.setMessage(message);
return this;
}
}
二、統一處理的抽象基礎類
所有的門面服務都應該繼承該抽象類
public abstract class BaseService {
public <T> Result<T> handle(BaseRequest request, Function<Object, Object> function) {
private Logger logger = LoggerFactory.getLogger(this.getClass());
try {
logger.info("request begin,request:{},function:{}", JSON.toJSON(request),
JSON.toJSON(function));
request = beforeHandle(request);
Object response = function.apply(request);
Result<T> result = afterHandle(request, response);
logger.info("request end,response:{}", JSON.toJSON(result));
return result;
}catch(ExceptionA e) {//自定義異常
Result<T> result = handleException(e);
return result;
}catch(ExceptionB e) {//自定義異常
logger.error("ExceptionB :" + e.getMessage() + ",response:"+ JSON.toJSONString(result), e);
Result<T> result = handleException(e);
return result;
}catch(Exception e) {// 未知異常
Result<T> result = handleException(e);
return result;
}
}
}
三、門面服務繼承統一攔截服務
public class AFacadeServiceImpl extends BaseService implements AService {
private ABizService aBizService;
public Result<AQueryResponse> query(AQueryRequest request) {
return this.handle(request, fun -> aBizService.query(request));
}
}
做到這一步,就可以實現統一的業務、異常、日誌的統一攔截了。