java封装结果集

递归星轨
• 阅读 708

java封装结果集

存在问题

一个用户的操作,比如登录,就可能会有很多种情况,用户层面的:账号错误、密码错误;服务器层面的:数据库错误等等情况。但是我们正常的是直接把一个参数解析成json对象返回给前端,那我们如何去判断是哪一种情况,并给用户一个反馈信息呢?

解决思路

我们平时可以直接解析一个java对象成json返回前端

//1. 创建一个user对象
User user = new User();
//2。 解析成json对象
String json = JSONObject.toJSONString(user);
//3. 返回前端
PrintWriter writer = response.getWriter();
writer.write(json);
writer.close();

既然可以直接解析一个java对象,那我们能不能新建一个类,里面可以存java对象(data:前端需要的数据),编码信息(code:提供前端判断)和提示信息(msg:提示用户的信息)。

解决办法

package cn.stopyc.constant;

/**
 * @program: return-project
 * @description: 返回值包装
 * @author: stop.yc
 * @create: 2022-04-01 12:24
 **/
public class Result<T> {
    /**
     * 编号
     */
    private Integer code;
    /**
     * 信息
     */
    private String msg;

    /**
     * 数据
     */
    private T data;

    public Result() {
        super();
    }

    public Result(Integer code, String msg, T data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
    }

    public Result(Integer code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    @Override
    public String toString() {
        return "Result{" +
                "code=" + code +
                ", msg='" + msg + '\'' +
                ", data=" + data +
                '}';
    }
}



@WebServlet("/user/*")
public UserServlet extends BaseServlet {
    
    public void login(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        //1. 获取前端信息
         BufferedReader reader = req.getReader();
        String userStr = reader.readLine();
        
        //2. json对象封装成java对象
        User user = JSON.parseObject(userStr, User.class);   
        
        //3.获取service对象
        UserService userService = new UserServiceImpl();

        //4.调用service层的登录功能,获取处理结果集(通过名字和密码进行登录)
        Result<User> userResult = userService.login(user);
        
        String json = JSONObject.toJSONString(userResult);
        //5. 返回前端
        PrintWriter writer = response.getWriter();
        writer.write(json);
        writer.close();
        
    }
}


//省略接口书写
public UserServiceImpl implements UserService {
    
    @Override
    public Result<User> login(User user) {
        
        //具体的业务逻辑实现。。。(只做演示使用,具体的逻辑是否正确不考虑)
        
        
        if(){
            //1.成功,返回一个对象,里面封装了编码,提示信息,数据.
            return new Result<>(400200,"登录成功",user);
        }else if(){
            //2. 密码错误
            return new Result<>(400210,"密码错误",user);
        }else if(){
            //3. 账号错误
            return new Result<>(400220,"账号错误",user);
        }
    }
}
const _this = this;
axios({
        method: "post",
        url: "http://localhost:8080/user/login",
        data: _this.user,
        }).then(function (resp) {

    //那么前端就可以根据你的编码进行判断一些需要执行的操作,比如密码错误需要执行什么操作,登录成功需要执行什么操作...
        if (resp.data.code === 400200) {
            _this.position = resp.data.data;
            _this.$message({
            message: resp.data.msg,
            type: 'success'
            });
        } else if (resp.data.code === 400210) {
                _this.$message.error(resp.data.msg);
        }else if (resp.data.code === 400220) {
            _this.$message.error(resp.data.msg);
        } else {
            _this.$message.error('未知错误,请联系管理员');
        }
 })

但是,编码这么多,都是自己随便写的,那怎么办呢?而且怎么做到前后端统一呢?那么我们可以维护一个枚举类,统一编码信息。

package cn.stopyc.constant;

/**
* @Description: 结果集枚举
* @Param:
* @return:
* @Author: stop.yc
* @Date: 2022/4/28
*/
public enum ResultEnum {
    //自定义
    //通用
    UNKNOWN_ERROR(-1,"未知错误"),
    SUCCESS(200,"成功"),
    SERVER_INTERNAL_ERROR(500,"服务器内部错误"),
    RESOURCE_NOT_FOUND(404,"资源未找到"),
    PARAMETER_NOT_VALID(400,"参数不合法"),
    DATABASE_ERROR(600,"数据库操作错误"),
    //用户模块 5002XX
    PASSWORD_FAILED(500200,"密码错误"),
    REPEAT_NAME(500210,"用户名重复"),
    FIND_USER_FAILED(500220,"用户名不存在"),
    CHECK_CODE_ERROR(500230,"验证码错误"),
    //任务模块 6002XX
    NO_TASK(600200,"当前没有任务"),
    //.......
 


    ;
    /**
     * 编号
     */
    private Integer code;
    /**
     * 信息
     */
    private String msg;

    ResultEnum(Integer code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    public Integer getCode() {
        return code;
    }

    public String getMsg() {
        return msg;
    }
}

那么以后的service层封装结果集的时候,直接调用枚举

return new Result<>(ResultEnum.SUCCESS.getCode(), ResultEnum.SUCCESS.getMsg(), user);
点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
4年前
2、尚硅谷_SSM高级整合_使用ajax操作实现页面的查询功能
16、尚硅谷\_SSM高级整合\_查询\_返回分页的json数据.avi在上一章节的操作中我们是将PageInfo对象存储在request域中,然后list页面解析request域中的对象实现信息的显示。但是上面的操作只适合客户端是浏览器的情况。如果客户端是android,也要查询人员列表信息,这个时候服务器返回的数据应该是json数据,所以我们需要对后
Stella981 Stella981
4年前
CAS 实现站内单点登录及实现第三方 OAuth、OpenId 登录(三)
一、概括    在大多数情况下,随着用户登录系统后,用户ID、用户名、Email、用户头像等等基本信息,需要被使用直到用户退出系统。    CASServer默认情况下,成功登录后,只会返回用户标示(通常是用户名)给CASClient。这时,各个Client还需要根据用户标示,去查询用户其它信息,这时如果如果CASSer
Wesley13 Wesley13
4年前
unittest参数化
在写case的时候,如果用例的操作是一样的,就是参数不同,比如说要测一个登录的接口,要测正常登录的,黑名单用户登录的,账号密码错误等等,在unittest里面要写多个case来测试。这样的情况只是调用接口的时候参数不一样而已,再写多个case的话就有点多余了,那怎么办呢,就得把这些参数都写到一个list里面,然后循环去执行这个case,这样就可以省去写多
Stella981 Stella981
4年前
CentOS LAMP环境配置好后,拒绝访问远程服务器
当LAMP环境配置好后,我们在本机:192.168.0.130使用Navicat连接服务器:192.168.0.168的时候会出现远程MySQL不允许访问的错误,这是因为Mysql为了安全性,在默认情况下用户只允许在本地登录,我们现在的情况是在本机使用phpmyadmin或则是Navicat进行登录、数据库管理,那么怎么办呢?我们需要进行如下操作:一、如
Stella981 Stella981
4年前
Gson字符串转实体的问题
这里遇到一个比较棘手的问题,原来项目中使用的不是Gson,客户端在请求json数据时如果没有具体的数据内容会返回空字符串,如:{"result":{"errorMessage":"用户名/密码错误","errorCode":0},"data":""}这里的data是表示没有具体的数据,但是在Gson解析时我们用来接受的数据却是具体的实体对象,be
Easter79 Easter79
4年前
SQLSever
如题,本文简记一下SQLSever里面登录用户(login)的创建,数据库用户(DBUser)的创建,以及给数据库用户分配权限(Grant)。数据库有三层保护机制:第一层:登录用户以及登录密码的保护,比如:你拥有进去小区大门的权限;第二层:数据库的权限,比如:小区有很多楼栋,你只拥有进去指定楼栋的权限;第三层:数据库操作的权限,比如:你进了
Stella981 Stella981
4年前
SpringBoot日记——错误页处理的配置篇
 在我们访问页面的时候经常会遇到各种问题,比如404,400,500,502等等,可返回的错误页对用户来讲,并不太亲民,所以要定制一下自己的错误页。 我们先访问一个错误页面,看下效果:(虽然给我们提供了错误时间、类型、状态码、错误信息,但是好丑,而且用户也不知道这是什么意思)!(https://oscimg.oschina.net/oscnet
Wesley13 Wesley13
4年前
Java入门之异常处理
1.异常概念异常指的是程序在执行过程中出现的非正常的情况,导致JVM的非正常停止。在Java中,异常是一个类,产生异常就是创建异常对象并抛出一个异常对象。异常指的并不是语法错误,语法错误,编译不会通过,而是编译通过后,程序执行异常。异常的作用是帮助我们找到程序中的问题。2.异常产生过程解析pub
Easter79 Easter79
4年前
SpringBoot日记——错误页处理的配置篇
 在我们访问页面的时候经常会遇到各种问题,比如404,400,500,502等等,可返回的错误页对用户来讲,并不太亲民,所以要定制一下自己的错误页。 我们先访问一个错误页面,看下效果:(虽然给我们提供了错误时间、类型、状态码、错误信息,但是好丑,而且用户也不知道这是什么意思)!(https://oscimg.oschina.net/oscnet
Wesley13 Wesley13
4年前
Java 多用户登录限制的实现方法
Java多用户登录限制的实现方法现在有两种解决方案:1、将用户的登录信息用一个标志位的字段保存起来,每次登录成功就标记1,注销登录就标记为0,当标记为1的时候不允许别人登录。2、将用户的登录信息保存在application内置作用域内,然后利用session监听器监听每一个登录用户的登录情况。很显然,第一种方式每次登录都需要操作数据库,多了一
Java服务总在半夜挂,背后的真相竟然是... | 京东云技术团队
最近有用户反馈测试环境Java服务总在凌晨00:00左右挂掉,用户反馈Java服务没有定时任务,也没有流量突增的情况,Jvm配置也合理,莫名其妙就挂了