在每个接口中都手动调用Result.success(...)对返回结果进行封装,这样处理的话太浪费体力了,而且也不太优雅。我们想要的效果是对返回结果的统一封装是全局的、无感的。想要实现这样的效果,我们只需要借助@ResponseBodyAdvice即可。
@RestControllerAdvice
public class CommonResponseDataAdvice implements ResponseBodyAdvice<Object> {
@Override
public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {
return true;
}
@Override
public Object beforeBodyWrite(Object data, MethodParameter methodParameter,
MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass,
ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
if (Objects.isNull(data)) {
return Result.success();
}
if (data instanceof Result) {
return data;
}
return Result.success(data);
}
}
这样,所有正常响应的请求的结果都封装成了统一的数据格式。
统一异常处理:
如果请求处理过程中发生了异常,我们需要使用@ExceptionHandler对异常结果进行统一封装。
@Slf4j
@RestControllerAdvice
public class RestExceptionHandler {
/**
* 默认全局异常处理。
*/
@ExceptionHandler(Exception.class)
public Result<Object> exception(Exception e) {
log.error("全局异常信息 ex={}", e.getMessage(), e);
return Result.fail(e.getMessage());
}
}
请求异常时返回结果示例:
{
"success": false,
"code": "500",
"data": null,
"msg": "自定义系统内部异常"
}