java封裝結果集
阿新 • • 發佈:2022-05-10
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);