java高级特性之泛型,实战进阶

java高级特性之泛型,实战进阶

继续之前一篇泛型的基础思想概念来说,本文介绍一下进阶实战,来封装一个服务端响应类
这个东西有什么用呢?如果说自己是全栈工程师的话可能自己能搞定就不说了,正常来说一个大型项目,不仅仅是前后端分离还有就是很多人合作,如果不限定返回的结过,可能每个接口返回的样式千奇百怪。比如你返回了用户信息,他返回来了个错误msg等。对于前段来说,需要很多的判断,影响整个项目的可扩展性和效率
比如这样:

// 获取用户信息,正确返回
{
    
    
    "username": "jiarupc",
    "nickname": "法外狂徒、张三",
    "create_date": "2020-12-31 00:00:00"
}

// 获取用户信息,错误返回
{
    
    
    "msg": "缺少参数,请传入 token"
}

所以为了解决这一问题,必须封装一个统一的响应类

1.设计

服务端响应类有 2 个要点:返回值、错误码。

先来看返回值。在返回前端的时候,我们必须至少要有这 3 个信息:

code,响应代码;
data,响应数据;
msg,响应信息;

其中响应代码,我们自己设计,大概如下

200-请求成功
101-执行错误
102-参数错误

设计整体就是这样那么,接下来就是开发工作了。

2.开发

2.1响应代码

public enum ResponseCode {
    
    

    // 成功返回
    SUCCESS(200, "SUCCESS"),
    // 执行错误
    ERROR(101, "ERROR"),
    // 参数错误
    ILLEGAL_ARGUMENT(102, "ILLEGAL_ARGUMENT"));

    private final int code;
    private final String desc;

    ResponseCode(int code, String desc) {
    
    
        this.code = code;
        this.desc = desc;
    }

    // 省略 getter 方法
}

2.2 服务端响应类

public class ServerResponse<T> implements Serializable {
    
    
    
    // 响应代码
    private int code;
    // 响应信息
    private String msg;
    // 响应数据
    private T data;

    /**
     * 构造方法
     */
    private ServerResponse(int code, String msg, T data) {
    
    
        this.code = code;
        this.msg = msg;
        this.data = data;
    }
    private ServerResponse(int code, T data) {
    
    
        this.code = code;
        this.data = data;
    }
    private ServerResponse(int code, String msg) {
    
    
        this.code = code;
        this.msg = msg;
    }
    private ServerResponse(int code) {
    
    
        this.code = code;
    }

    /**
     * 请求成功
     * @param msg  返回信息
     * @param data 泛型数据
     * @param <T>  返回数据,可以不填
     * @return 1.状态码(默认) 2.返回信息 3.泛型数据
     */
    public static <T> ServerResponse<T> createSuccess(String msg, T data) {
    
    
        return new ServerResponse<>(ResponseCode.SUCCESS.getCode(), msg, data);
    }
    public static <T> ServerResponse<T> createSuccess(T data) {
    
    
        return new ServerResponse<>(ResponseCode.SUCCESS.getCode(), data);
    }
    public static <T> ServerResponse<T> createSuccess(String msg) {
    
    
        return new ServerResponse<>(ResponseCode.SUCCESS.getCode(), msg);
    }
    public static <T> ServerResponse<T> createSuccess() {
    
    
        return new ServerResponse<>(ResponseCode.SUCCESS.getCode());
    }

    /**
     * 请求失败
     * @param code
     * @param msg
     * @return 1.状态码(自定义) 2.返回信息(自定义)
     */
    public static <T> ServerResponse<T> createError(int code, String msg) {
    
    
        return new ServerResponse<>(code, msg);
    }
    public static <T> ServerResponse<T> createError() {
    
    
        return new ServerResponse<>(ResponseCode.ERROR.getCode(), ResponseCode.ERROR.getDesc());
    }
    public static <T> ServerResponse<T> createError(String msg) {
    
    
        return new ServerResponse<>(ResponseCode.ERROR.getCode(), msg);
    }

    
    // 省略 getter 方法
}

结束

至此我们的封住类就完成了,就可以做出规定,service,controller层返回结果都要用这个类封装。

猜你喜欢

转载自blog.csdn.net/qq_44772660/article/details/112859038