common--全局返回

简介: controller层全局实体类包装返回

一、自定义全局返回包装类

/**
 * @Description 统一结果集
 */
@Getter
@ToString
public class ResultSet<T> {

    private Integer status; //状态码

    private String codeMessage; //状态码信息

    @Setter
    private String errorMessage;   //前后端对接错误信息

    @Setter
    private String errorMessageToUser; //给用户看的错误信息

    private Date timestamp = new Date();    // 当前时间

    @Setter
    private T data; //响应数据

    //私有构造器
    private ResultSet() {
    }

    //响应成功,无响应数据
    public static ResultSet<?> success() {
        ResultSet<?> resultSet = new ResultSet<>();
        resultSet.status = CodeEnum.SUCCESS.getCode();
        resultSet.codeMessage = CodeEnum.SUCCESS.getCodeMessage();
        return resultSet;
    }

    //响应成功,有响应数据
    public static <T> ResultSet<T> success(T data) {
        ResultSet<T> resultSet = new ResultSet<>();
        resultSet.status = CodeEnum.SUCCESS.getCode();
        resultSet.codeMessage = CodeEnum.SUCCESS.getCodeMessage();
        resultSet.data = data;
        return resultSet;
    }

    //响应失败(仅供异常处理器使用,其他地方建议均以抛出异常的方式响应)
    public static ResultSet<?> error(CodeEnum codeEnum, String errorMessage, String errorMessageToUser) {
        ResultSet<?> resultSet = new ResultSet<>();
        resultSet.status = codeEnum.getCode();
        resultSet.codeMessage = codeEnum.getCodeMessage();
        resultSet.errorMessage = errorMessage;
        resultSet.setErrorMessageToUser(errorMessageToUser);
        return resultSet;
    }

    public static <T> ResultSet<T> custom(CodeEnum codeEnum, T data) {
        ResultSet<T> resultSet = new ResultSet<>();
        resultSet.status = codeEnum.getCode();
        resultSet.codeMessage = codeEnum.getCodeMessage();
        resultSet.data = data;
        return resultSet;
    }

}

二、拦截接口返回处理

//此注解针对controller层的类做增强功能,即对加了@RestController注解的类进行处理

/**
*此注解针对controller层的类做增强功能,即对加了@RestController注解的类进行处理
*/
@ControllerAdvice(annotations = RestController.class)
public class RestResponseBodyAdvice implements ResponseBodyAdvice<Object> {
    @Override
    public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
        return true;
    }

    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request,
                                  ServerHttpResponse response) {

        // 如果是通过Feign调用,不包装,直接返回
        if (request.getHeaders().containsKey(Global.FEIGN)) {
            return body;
        }

        //body为空
        if(Objects.isNull(body)){
            return ResultSet.success();
        }
        //为文件
        if(body instanceof Resource){
            return body;
        }
        //方法返回类型void
        if (returnType.getMethod().getReturnType().isAssignableFrom(Void.TYPE)) {
            return ResultSet.success();
        }
        //ResultSet||ResponseEntity直接返回
        if((body instanceof ResultSet)||(body instanceof ResponseEntity)){
            return body;
        }
        //处理string类型的返回值
        //当返回类型是String时,用的是StringHttpMessageConverter转换器,无法转换为Json格式
        //必须在方法体上标注RequestMapping(produces = "application/json; charset=UTF-8")
        if (body instanceof String) {
            return JsonUtils.obj2String(ResultSet.success(body));
        }
        //该方法返回的媒体类型是否是application/json。若不是,直接返回响应内容
        if (!selectedContentType.includes(MediaType.APPLICATION_JSON)) {
            return body;
        }
        return ResultSet.success(body);
    }
}
目录
相关文章
|
6月前
|
编译器
【【C++11特性篇】【强制/禁止 】生成默认函数的关键字default&delete(代码演示)
【【C++11特性篇】【强制/禁止 】生成默认函数的关键字default&delete(代码演示)
|
6月前
|
存储 API
使用Webpack的module.hot API来定义模块的热替换
使用Webpack的`module.hot` API实现模块热替换,简单示例展示如何在`myModule`变化时执行回调。`module.hot.accept`接收模块路径和回调函数,当模块或其依赖变更时触发回调,用于执行更新逻辑。可通过`module.hot.data`保存和恢复状态以实现热替换时保持应用程序的状态。
|
3月前
|
前端开发 API
【API管理 APIM】APIM中如何配置使用URL路径的方式传递参数(如由test.htm?name=xxx 变为test\xxx)
【API管理 APIM】APIM中如何配置使用URL路径的方式传递参数(如由test.htm?name=xxx 变为test\xxx)
|
6月前
|
XML Java 数据格式
面试题:怎样把所有的组件的lazy-init值都设置为默认true?
面试题:怎样把所有的组件的lazy-init值都设置为默认true?
48 0
|
前端开发 JavaScript
解决前端报错 Error: Cannot find module ‘xxx‘(包含 uniapp)
解决前端报错 Error: Cannot find module ‘xxx‘(包含 uniapp)
2577 0
ts解决依赖引入报错:无法找到模块“xxxxxx”的声明文件的报错问题
ts解决依赖引入报错:无法找到模块“xxxxxx”的声明文件的报错问题
1883 0
“UnwrapRef“ 是一种类型,在同时启用了 “preserveValueImports“ 和 “isolatedModules“ 时,必须使用仅类型导入进行导入。
“UnwrapRef“ 是一种类型,在同时启用了 “preserveValueImports“ 和 “isolatedModules“ 时,必须使用仅类型导入进行导入。
1016 0
“UnwrapRef“ 是一种类型,在同时启用了 “preserveValueImports“ 和 “isolatedModules“ 时,必须使用仅类型导入进行导入。
|
存储 程序员 编译器
c++11标准 类默认函数的控制:"=default" 和 "=delete"函数
c++11标准 类默认函数的控制:"=default" 和 "=delete"函数
266 0
|
微服务
common--全局异常处理器
微服务相关统一处理
264 0
common--全局异常处理器
|
存储 Java 微服务
common--全局日志处理
操作日志和微服务场景日志统一处理
242 0
common--全局日志处理