文章目录
JsonResult类的代码
/**
* 通用JsonResult
*/
@Data
public class JsonResult<T> {
private static final long serialVersionUID =-123847128341023033L;
@JSONField
private boolean success = true;
@JSONField
private String message = null;
@JSONField
private String errorCode = "0";
@JSONField
private String errorMsg = "操作成功";
@JSONField
private Integer total = 0;
@JSONField
private List<T> data = new ArrayList();
public JsonResult() {
}
/**
* 当有异常时,直接throw一个实现ErrorCode的异常类
* 通过global异常处理器,就可以把jsonResult封装起来,这样代码简洁优美
* 如果没有BaseException可以注释掉这个方法
*/
// public JsonResult(BaseException exception) {
// if (exception != null) {
// success = false;
// errorCode = exception.getErrorCode();
// errorMsg = exception.getErrorMsg();
// }
// }
/**
* 虽然很多人都写为isSuccess(),但强烈不建议,因为相当于getSuccess()
* 可以用idea的自动生成下,如果有isSuccess(),就不会生成getSuccess()
*/
public boolean successFlag() {
return success;
}
public JsonResult(List<T> data) {
if (data != null && data.size() > 0) {
this.data = data;
}
}
public JsonResult(T data) {
if (data != null) {
this.data.add(data);
}
}
// 失败情况的构造 只用errorCode,errorMsg即可
public JsonResult(String errorCode,String errorMsg) {
this.success=false;
this.errorCode=errorCode;
this.errorMsg=errorMsg;
}
}
成功
成功情况下,放入要返回的数据即可:
1、data
2、total
成功情况下,message一般用不到,用默认的就可以了。
成功的情况下如何封装
用如下封装方式:
List<String> list =new ArrayList<>();
JsonResult<String> jsonResult = new JsonResult<>(list); //直接把data放到里面了
jsonResult.setTotal(list.size());
失败
失败情况下一般设置3个字段即可(data是不需要的):
success: false
code: -1 或对应的错误码
message: 错误提示
失败的情况下的封装(手动封装)
JsonResult<String> jsonResult = new JsonResult<>();
//异常时 success字段,code字段一定要记得重置。 因为success默认是true,code默认为0
jsonResult.setSuccess(false);
jsonResult.setErrorCode("-1");
jsonResult.setErrorMsg("系统异常"); // 这个字段一般也需要
//异常情况下data和total一般不需要
失败情况下的code,message半自动封装
上面那种完全可以实现功能,但是代码看起来有点啰嗦,可以加个构造器,传入errorCode,errorMsg:
JsonResult<String> jsonResult = new JsonResult("-1","未知错误");
失败情况下抛异常让全局异常处理器处理
思路:
1、代码错误时抛出一个包含code和message的exception类。
2、全局拦截器拦截异常并封装返回jsonResult。
BaseException 大体如下:
@Data
public class BaseException extends RuntimeException {
private static final long serialVersionUID = 6599301895983119239L;
String errorCode;
String errorMsg;
public BaseException(String errorCode, String errorMsg) {
super(errorMsg);
this.errorCode = errorCode;
this.errorMsg = errorMsg;
}
}
代码中这么写:
Object object=null;
if(object==null){
throw new BaseException("-1","系统异常");
}
异常拦截器获取到异常放到jsonResult中返回,代码如下:
BaseException baseException=new BaseException("-1","系统异常"); // 这个模拟拦截器捕获到的异常
JsonResult jsonResult = new JsonResult(baseException); // 直接放到json里面即可,(构造的时候会设置success,code,message)
return jsonResult;
这其实也能解决很多人反映的service里面写很多if,return的问题。
如何判定成功和失败(success、false)
如果发生了异常,那么一般判定为失败。
有的时候,查不到,该成功还是失败?
这个要看情况。
例如超期接口,没有设置超期就查不到。这个是正常的。
例如转账接口,查不到任何一方,肯定要报异常,因为业务就无法完成。
判定成功和失败2
判断依据主要为,是否拿到了预期的结果。
例如: 接口为用户列表查询
queryUserList();
即使一条也没有。也应该设置为true。
例如: 接口为根据用户名获取用户类型
queryUserType();
如果queryUserList() 没有查到结果。
这时要设置为false。因为没数据,用户类型根本不知道是什么?
对于导入excel这种如何返回
这种情况比较特殊,可以将出错的数据放到data中,因为成功的数据并不关心。
如果非要2个都存,可以专门设计个jsonResult,再加个errorData存放数据。
至于错误数据如何存放,如果是本地的可以自定义,如果是远程的,直接list.add 返回的报文即可。