通用jsonResult封装返回结果

  • Post author:
  • Post category:其他




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 返回的报文即可。



版权声明:本文为enthan809882原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。