最近做了一个springboot项目,对返回的数据做了进一步的封装,做一些必要的笔记,一来是对自己学习的知识的巩固,二来对有同样问题的人有参考作用。
一 封装结果类
一般成功时,需要返回的是数据(data,比如List),此时的状态码和返回信息比较固定,而请求异常(比如输入的密码错误)时不返回数据,而返回的是特定的状态码和错误提示。
package com.ergouy.miaosha.result;
public class Result <T> {
private int code; // 状态码
private String msg; // 返回的信息
private T data; // 返回的数据
private Result(T data) {
this.code = 0;
this.msg = "success";
this.data = data;
}
private Result(CodeMsg cm) {
if (cm == null){
return ;
}
this.code = cm.getCode();
this.msg = cm.getMsg();
}
/**
* 成功时候的调用
* @param data
* @param <T>
* @return
*/
public static <T> Result<T> success(T data){
return new Result<T>(data);
}
/**
* 异常时候的调用
* @param cm
* @param <T>
* @return
*/
public static <T> Result<T> error(CodeMsg cm){
return new Result<T>(cm);
}
public int getCode() {
return code;
}
public String getMsg() {
return msg;
}
public T getData() {
return data;
}
}
二 错误信息进一步封装
对错误信息进行封装,有利于对系统的维护。
package com.ergouy.miaosha.result;
public class CodeMsg {
private int code;
private String msg;
private CodeMsg(int i, String success) {
this.code = i;
this.msg = success;
}
//通用异常
public static CodeMsg SUCCESS = new CodeMsg(0,"success");
public static CodeMsg SERVER_ERROR = new CodeMsg(500100,"服务端异常");
public static CodeMsg BIND_ERROR = new CodeMsg(500101,"参数校验异常: %s");
public static CodeMsg REQUEST_ILLEGAL = new CodeMsg(500102,"请求非法");
//带动态参数的异常
public CodeMsg fillArgs(Object... args){
int code = this.code;
String message = String.format(this.msg, args);
return new CodeMsg(code,message);
}
public int getCode() {
return code;
}
public String getMsg() {
return msg;
}
}
三 静态返回结果测试
- 后台代码
/**
* 轮询秒杀结果
* orderId:成功
* -1:失败
* 0:排队中
* @param model
* @param user
* @param goodsId
* @return
*/
@RequestMapping(value = "/result",method = RequestMethod.GET)
@ResponseBody
public Result<Long> miaoshaResult(Model model, MiaoshaUser user, @RequestParam("goodsId") long goodsId) {
model.addAttribute("user", user);
if (user == null){
return Result.error(CodeMsg.SESSION_ERROR);
}
long result = miaoshaService.getMiaoshaResult(user.getId(),goodsId);
return Result.success(result);
}
- 前端代码
function getMiaoshaResult(goodsId) {
g_showLoading();
$.ajax({
url:'/miaosha/result',
type:'GET',
data:{
goodsId:$('#goodsId').val()
},
success:function (data) {
if (data.code == 0){
var result = data.data;
if (result < 0){//秒杀失败
layer.msg('对不起,秒杀失败');
}else if(result == 0){//继续轮询
setTimeout(function () {
getMiaoshaResult(goodsId);
},400);
}else{//秒杀成功
layer.confirm('恭喜您,秒杀成功!查看订单?',{btn:['确定','取消']}
,function () {
window.location.href = '/order_detail.htm?orderId='+ result;
}
,function () {
layer.closeAll();
});
}
} else{
layer.msg(data.msg)
}
},
error:function () {
layer.msg('客户端请求错误');
}
});
}
四 动态返回结果测试
if (e instanceof BindException){
BindException ex = (BindException) e;
List<ObjectError> errors = ex.getAllErrors();
ObjectError error = errors.get(0);
String msg = error.getDefaultMessage(); // msg = "手机格式错误 ";
return Result.error(CodeMsg.BIND_ERROR.fillArgs(msg)); //拼接后的返回给前端的错误提示是 "参数校验异常:手机格式错误"
}
五 总结
如有错误恳请指正,如有侵权请联系我删除