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);
    }
}
目录
相关文章
|
7月前
|
存储 NoSQL 数据库
全局id生成方式
全局id生成方式
ts解决依赖引入报错:无法找到模块“xxxxxx”的声明文件的报错问题
ts解决依赖引入报错:无法找到模块“xxxxxx”的声明文件的报错问题
1998 0
|
IDE Java API
Gradle | 全局配置、Log开关控制、Build Variant、meta-data等配置
Gradle是一个先进的构建系统,也是一个允许通过插件创建自定义构建逻辑先进的构建工具。
500 0
|
SQL JavaScript 前端开发
第三十六章 使用 CSP 进行基于标签的开发 - 使用尽可能少的#server和#call调用
第三十六章 使用 CSP 进行基于标签的开发 - 使用尽可能少的#server和#call调用
136 0
|
JSON 安全 Go
Go 中使用 JSON 时,如何区分空字段和未设置字段
Go 中使用 JSON 时,如何区分空字段和未设置字段
632 0
|
JavaScript
js修改对象的key值
js修改对象的key值
js修改对象的key值
|
JavaScript
JS 高级(四)ES5保护对象、Object.create()、替换this指向
JS 高级(四)ES5保护对象、Object.create()、替换this指向
288 0
JS 高级(四)ES5保护对象、Object.create()、替换this指向
|
微服务
common--全局异常处理器
微服务相关统一处理
270 0
common--全局异常处理器
|
存储 Java 微服务
common--全局日志处理
操作日志和微服务场景日志统一处理
247 0
common--全局日志处理
|
Java
MessagePack Java 0.6.X 可选字段
你可添加一个新的字段来保持可用性。在新字段中使用 @Optional 注解。 @Messagepublic static class MyMessage {    public String name;    public double version;      // new field    @Optional    public int flag = 0;} 如果你尝试反序列化老版本数据的话,可选字段将会被忽略。
580 0