百木园-与人分享,
就是让自己快乐。

java封装结果集

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);

来源:https://www.cnblogs.com/stopyc/p/16253455.html
本站部分图文来源于网络,如有侵权请联系删除。

未经允许不得转载:百木园 » java封装结果集

相关推荐

  • 暂无文章