一、定义一个通用的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));
}
}
做到这一步,就可以实现统一的业务、异常、日志的统一拦截了。