SpringBoot进一步封装返回的JSON数据

本文介绍了在SpringBoot项目中如何进一步封装返回的JSON数据,包括封装结果类以处理成功和异常情况,对错误信息的详细封装,以及静态和动态返回结果的测试。通过这种方式,不仅提高了代码的可维护性,也为前端提供了统一的数据格式。
摘要由CSDN通过智能技术生成

最近做了一个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;
    }
    
}
三 静态返回结果测试
  1. 后台代码
/**
  * 轮询秒杀结果
  * 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);
 }
  1. 前端代码
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)); //拼接后的返回给前端的错误提示是 "参数校验异常:手机格式错误"
  }

五 总结

如有错误恳请指正,如有侵权请联系我删除

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值