【Spring Boot笔记】统一处理返回结果

205 阅读1分钟

接上篇【Spring Boot笔记】统一返回结果的格式

在每个接口中都手动调用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);
    }
}

这样,所有正常响应的请求的结果都封装成了统一的数据格式。

image-20220513132018125

统一异常处理:

如果请求处理过程中发生了异常,我们需要使用@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": "自定义系统内部异常"
}