news 2026/6/13 21:23:15

通用jsonResult封装返回结果(boolean方法也可以通过这个返回的)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
通用jsonResult封装返回结果(boolean方法也可以通过这个返回的)

文章目录

      • JsonResult类的代码
      • JsonResult类的代码-简版(不要errorCode)(推荐)
      • io流中的jsonResult工具类
    • 成功
      • 成功的情况下如何封装
    • 失败
      • 失败的情况下的封装(手动封装)
      • 失败情况下的code,message半自动封装
      • 失败情况下抛异常让全局异常处理器处理
      • 如何判定成功和失败(success、false)
      • 判定成功和失败2
      • 对于导入excel这种如何返回
      • boolean方法用jsonResult也是可以的

JsonResult类的代码

/** * 通用JsonResult 构造器私有化,静态方法ok表示成功, fail表示失败。 */@DatapublicclassJsonResult<T>{privatestaticfinallongserialVersionUID=-123847128341023033L;@JSONFieldprivatebooleansuccess=true;@JSONFieldprivateStringmessage=null;@JSONFieldprivateStringerrorCode="0";@JSONFieldprivateStringerrorMsg="操作成功";@JSONFieldprivateIntegertotal=0;@JSONFieldprivateList<T>data=newArrayList();privateJsonResult(){}/** * 虽然很多人都写为isSuccess(),但强烈不建议,因为相当于getSuccess() * 可以用idea的自动生成下,如果有isSuccess(),就不会生成getSuccess() */publicbooleansuccessFlag(){returnsuccess;}publicJsonResult(Tdata){if(data!=null){this.data.add(data);}}publicJsonResult(List<T>data){if(data!=null&&data.size()>0){this.data=data;}}publicstaticJsonResultok(){returnnewJsonResult();}publicstatic<T>JsonResultok(List<T>data){JsonResultjsonResult=newJsonResult();if(data!=null&&data.size()>0){jsonResult.data=data;}returnjsonResult;}publicstatic<T>JsonResultok(Tdata){JsonResultjsonResult=newJsonResult();if(data!=null){jsonResult.data.add(data);}returnjsonResult;}publicstatic<T>JsonResultok(Stringstring){JsonResultjsonResult=newJsonResult();jsonResult.setErrorMsg(string);returnjsonResult;}publicstaticJsonResultfail(StringerrorCode,StringerrorMsg){JsonResultjsonResult=newJsonResult();jsonResult.setSuccess(false);jsonResult.setErrorCode(errorCode);jsonResult.setErrorMsg(errorMsg);returnjsonResult;}/** * 当有异常时,直接throw一个实现ErrorCode的异常类 * 通过global异常处理器,就可以把jsonResult封装起来,这样代码简洁优美 * 如果没有BaseException可以注释掉这个方法 */// public static JsonResult fail(BaseException exception){// JsonResult jsonResult = new JsonResult();// if (exception != null) {// jsonResult.success = false;// jsonResult.errorCode = exception.getErrorCode();// jsonResult.errorMsg = exception.getErrorMsg();// }// return jsonResult;// }publicstaticvoidmain(String[]args){JsonResultjsonResult=JsonResult.ok(newDemo());System.out.println(JSON.toJSONString(jsonResult));}}

JsonResult类的代码-简版(不要errorCode)(推荐)

/** * 通用JsonResult 构造器私有化,静态方法ok表示成功, fail表示失败。 */@DatapublicclassJsonResult<T>{privatestaticfinallongserialVersionUID=-123847128341023033L;@JSONFieldprivatebooleansuccess=true;@JSONFieldprivateStringmessage="操作成功";@JSONFieldprivateStringcode="0";@JSONFieldprivateIntegertotal=0;@JSONFieldprivateList<T>data=newArrayList();privateJsonResult(){}/** * 虽然很多人都写为isSuccess(),但强烈不建议,因为相当于getSuccess() * 可以用idea的自动生成下,如果有isSuccess(),就不会生成getSuccess() */publicbooleansuccessFlag(){returnsuccess;}publicJsonResult(Tdata){if(data!=null){this.data.add(data);}}publicJsonResult(List<T>data){if(data!=null&&data.size()>0){this.data=data;}}publicstaticJsonResultok(){returnnewJsonResult();}publicstatic<T>JsonResultok(List<T>data){JsonResultjsonResult=newJsonResult();if(data!=null&&data.size()>0){jsonResult.data=data;}returnjsonResult;}publicstatic<T>JsonResultok(Tdata){JsonResultjsonResult=newJsonResult();if(data!=null){jsonResult.data.add(data);}returnjsonResult;}publicstaticJsonResultfail(StringerrorCode,StringerrorMsg){JsonResultjsonResult=newJsonResult();jsonResult.setSuccess(false);jsonResult.setCode(errorCode);jsonResult.setMessage(errorMsg);returnjsonResult;}/** * 当有异常时,直接throw一个实现ErrorCode的异常类 * 通过global异常处理器,就可以把jsonResult封装起来,这样代码简洁优美 * 如果没有BaseException可以注释掉这个方法 */// public static JsonResult fail(BaseException exception){// JsonResult jsonResult = new JsonResult();// if (exception != null) {// jsonResult.success = false;// jsonResult.errorCode = exception.getErrorCode();// jsonResult.errorMsg = exception.getErrorMsg();// }// return jsonResult;// }publicstaticvoidmain(String[]args){}}

io流中的jsonResult工具类

特别注意response.isCommitted()这行很关键。

@Slf4jpublicclassIOResultUtils{/** * @param response 响应对象 * @param httpStatus 标准的 HTTP 状态码(如 404, 500) * @param code 你的自定义业务错误码(如 "-1", "30001") * @param message 错误提示信息 */publicstaticvoiderror(HttpServletResponseresponse,inthttpStatus,Stringcode,Stringmessage){try{// 1. 检查响应是否已经提交(如果已经开始下载文件了,就不能再写 JSON 了)if(response.isCommitted()){log.warn("响应已提交,无法写入错误 JSON: {}",message);return;}// 2. 设置标准的 HTTP 状态码(绝对不要传 -1 给 setStatus)response.setStatus(httpStatus);response.setContentType("application/json;charset=UTF-8");// 3. 写入自定义的 JSON 响应体JsonResultfailResult=JsonResult.fail(code,message);response.getWriter().write(JSON.toJSONString(failResult));response.getWriter().flush();// 强制刷出缓冲区}catch(IOExceptione){log.error("io流result工具类操作异常,error=",e);}}}

成功

成功情况下,放入要返回的数据即可:
1、data
2、total
成功情况下,message一般用不到,用默认的就可以了。

成功的情况下如何封装

用如下封装方式:

List<String>list=newArrayList<>();JsonResult<String>jsonResult=newJsonResult<>(list);//直接把data放到里面了jsonResult.setTotal(list.size());

失败

失败情况下一般设置3个字段即可(data是不需要的):
success: false
code: -1 或对应的错误码
message: 错误提示

失败的情况下的封装(手动封装)

JsonResult<String>jsonResult=newJsonResult<>();//异常时 success字段,code字段一定要记得重置。 因为success默认是true,code默认为0jsonResult.setSuccess(false);jsonResult.setErrorCode("-1");jsonResult.setErrorMsg("系统异常");// 这个字段一般也需要//异常情况下data和total一般不需要

失败情况下的code,message半自动封装

上面那种完全可以实现功能,但是代码看起来有点啰嗦,可以加个构造器,传入errorCode,errorMsg:

JsonResult<String>jsonResult=newJsonResult("-1","未知错误");

失败情况下抛异常让全局异常处理器处理

思路:
1、代码错误时抛出一个包含code和message的exception类。
2、全局拦截器拦截异常并封装返回jsonResult。
BaseException 大体如下:

@DatapublicclassBaseExceptionextendsRuntimeException{privatestaticfinallongserialVersionUID=6599301895983119239L;StringerrorCode;StringerrorMsg;publicBaseException(StringerrorCode,StringerrorMsg){super(errorMsg);this.errorCode=errorCode;this.errorMsg=errorMsg;}}

代码中这么写:

Objectobject=null;if(object==null){thrownewBaseException("-1","系统异常");}

异常拦截器获取到异常放到jsonResult中返回,代码如下:

BaseExceptionbaseException=newBaseException("-1","系统异常");// 这个模拟拦截器捕获到的异常JsonResultjsonResult=newJsonResult(baseException);// 直接放到json里面即可,(构造的时候会设置success,code,message)returnjsonResult;

这其实也能解决很多人反映的service里面写很多if,return的问题。

如何判定成功和失败(success、false)

如果发生了异常,那么一般判定为失败。

有的时候,查不到,该成功还是失败?
这个要看情况。

例如超期接口,没有设置超期就查不到。这个是正常的。
例如转账接口,查不到任何一方,肯定要报异常,因为业务就无法完成。

判定成功和失败2

判断依据主要为,是否拿到了预期的结果。

例如: 接口为用户列表查询
queryUserList();
即使一条也没有。也应该设置为true。

例如: 接口为根据用户名获取用户类型
queryUserType();
如果queryUserList() 没有查到结果。
这时要设置为false。因为没数据,用户类型根本不知道是什么?

对于导入excel这种如何返回

这种情况比较特殊,可以将出错的数据放到data中,因为成功的数据并不关心。
如果非要2个都存,可以专门设计个jsonResult,再加个errorData存放数据。

至于错误数据如何存放,如果是本地的可以自定义,如果是远程的,直接list.add 返回的报文即可。

boolean方法用jsonResult也是可以的

很多时候用boolean方法,方便是方便,但是有个确定,如果要带出原因就无能为力了。
其实boolean方法用jsonResult也可以,这样就可以带出message了。
但是有几个点:
1、只用code和message,所以不涉及data.get(0)之类繁琐的代码。 # boolean方法不用jsonResult很大程度是因为getData()判空太麻烦,其实完全用不到data。
2、初始化的result应该是false,即:new JsonResult.error(“-1”,“失败”);
3、调用的方法写起来其实也不复杂。

boolean写法:if(flag){}jsonResult写法:if(result.isSuccess()){}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/11 9:23:18

Java数组中查找元素的方法

Java数组中查找元素的方法 要恰饭的嘛~ 2020-08-15 20:43:51 29 收藏 分类专栏&#xff1a; Java 文章标签&#xff1a; java索引数据结构 版权 Arrays类的binarySearch()方法&#xff0c;可以使用二分搜索法来搜索指定的数组。该方法返回要搜索元素的索引值。binarySearc…

作者头像 李华
网站建设 2026/6/11 9:23:14

那些年,我们写过的低级BUG,警钟长鸣

又一个低级的生产BUG if(newDto.getStoreName().equals(oldDto.getStoreName()) &&newDto.getStoreCode().equals(oldDto.getStoreCode()) &&newDto.getGoodsName().equals(oldDto.getGoodsName()) &&newDto.getGoodsSpec().equals(oldDto.getGoodsSpe…

作者头像 李华
网站建设 2026/6/11 9:23:12

Koikatu HF Patch终极指南:200+插件与完整翻译体验一键解锁

Koikatu HF Patch终极指南&#xff1a;200插件与完整翻译体验一键解锁 【免费下载链接】KK-HF_Patch Automatically translate, uncensor and update Koikatu! and Koikatsu Party! 项目地址: https://gitcode.com/gh_mirrors/kk/KK-HF_Patch 还在为《恋活&#xff01;》…

作者头像 李华
网站建设 2026/6/11 9:23:09

MC9S08JS16嵌入式开发实战:从USB集成到低功耗设计

1. 项目概述与芯片定位在嵌入式开发领域&#xff0c;选型往往是项目成功的第一步。面对市场上琳琅满目的微控制器&#xff0c;工程师们常常需要在性能、成本、功耗和集成度之间寻找最佳平衡点。对于许多需要USB连接、成本敏感且对实时性有一定要求的应用——比如自定义的HID设备…

作者头像 李华
网站建设 2026/6/11 9:23:08

I2C总线协议深度解析与MC9S08DE60实战应用

1. I2C总线协议&#xff1a;从基础到实战的深度解析在嵌入式系统开发中&#xff0c;设备间的通信是构建复杂功能的基础。面对众多通信协议&#xff0c;I2C&#xff08;Inter-Integrated Circuit&#xff09;以其简洁的两线制、支持多主多从、以及相对适中的速率&#xff0c;成为…

作者头像 李华
网站建设 2026/6/11 9:22:51

别再搞混了!Isaac Sim中相机、图像、机器人坐标系的保姆级图解指南

Isaac Sim坐标系全解析&#xff1a;从原理到实战避坑指南第一次在Isaac Sim里调试机器人抓取动作时&#xff0c;我盯着屏幕上那个往完全相反方向移动的机械臂发呆了五分钟——明明代码里的坐标计算看起来天衣无缝&#xff0c;为什么实际执行时会出现这种低级错误&#xff1f;直…

作者头像 李华