1. 程式人生 > 其它 >java封裝結果集

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