VO的使用

VO是view object的简称,中文意思是视图对象,也就是我们在controller中返回给前端的内容。一般开发时,我们要按照前端给的文档给前端返回相应的内容,比如现有api如下:

路由:GET /sell/buyer/product/list
参数:无
返回:

{
    "code": 0,
    "msg": "成功",
    "data": [
        {
            "name": "类目名1",
            "type": 1,
            "foods": [
                {
                    "id": "123456",
                    "name": "商品名1",
                    "price": 4.5,
                    "description": "xxxxx",
                    "icon": "http://xxx.com",
                }
            ]
        },
        {
            "name": "类目名2",
            "type": 2,
            "foods": [
                {
                    "id": "123457",
                    "name": "商品名2",
                    "price": 10.9,
                    "description": "xxxxx",
                    "icon": "http://xxx.com",
                },
                {
                    "id": "123457",
                    "name": "商品名3",
                    "price": 10.9,
                    "description": "xxxxx",
                    "icon": "http://xxx.com",
                }
            ]
        }
    ]
}

一个中括号就表示里面的是list。那么可以知道,最外层是由code、msg和类目的list组成;第二层就是由类目名name、type和商品的list组成;商品的list就包含了商品的信息。那么要如何构造这样的返回对象呢?先从最外层开始写。根据最外层的三个字段,可以写出ResultVo类:

/**
 * 返回给前端的最外层对象
 * Create by zhu on 2018/10/7
 */
@Data
public class ResultVo<T> {
    private Integer code;//错误码
    private String msg;//提示信息
    private T data;//返回的内容
}

这里data定义为泛型,这样就可以通用。
现在将ResultVo对象返回给前端:

 public ResultVo test(){
        ResultVo resultVo = new ResultVo();
        resultVo.setCode(0);
        resultVo.setMsg("test");
        resultVo.setData("这是内容");
        return resultVo;
 }

就会得到如下效果:
在这里插入图片描述
说明最外层是没有错的,根据api提供的信息又可以写出如下vo:

@Data
public class ProductVo {
    //这里写的字段名与前端api需要的不一致没关系,加上如下注解,直接里面写api需要的字段名
    @JsonProperty("name")
    private String categoryName;
    @JsonProperty("type")
    private Integer categoryType;
    @JsonProperty("foods")//这个foods是一个商品的list
    private List<ProductInfoVo> productInfoVoList;
}
//这个就是最里层的商品对象
@Data
public class ProductInfoVo {
    @JsonProperty("id")
    private String productId;
    @JsonProperty("name")
    private String productName;
    @JsonProperty("price")
    private BigDecimal productPrice;
    @JsonProperty("description")
    private String productDescription;
    @JsonProperty("icon")
    private String productIcon;
}

注意,前端需要的name其实是类目名,如果这个vo也直接定义变量name,到时候会搞不清楚到底是商品的name还是类目的name。解决方案是:这里应该是什么就写什么,然后通过@JsonProperty(“xxx”)来指定返回给前端时的名字。

写好后再去controller中:

 @GetMapping("/test")
    public ResultVo test() {
        ResultVo resultVo = new ResultVo();
        ProductVo productVo = new ProductVo();
        ProductInfoVo productInfoVo = new ProductInfoVo();

        productInfoVo.setProductName("商品1");
        productVo.setProductInfoVoList(Arrays.asList(productInfoVo));
        productVo.setCategoryName("类目1");

        resultVo.setData(Arrays.asList(productVo));
        resultVo.setMsg("成功");
        resultVo.setCode(0);

        return resultVo;
    }

把最里层的赋好值设置给中间层,中间层赋好值设置给最外层,再把最外层返回给前端,效果如下:

在这里插入图片描述
这样返回的格式就对了,和api一致。接下来要做的事就是从数据库查出相应的记录,然后赋给这三个对象就行了。
从上面的controller中可以发现,我们每次都要new一个最外层的ResultVo对象,然后setCode、setMsg、setData。每个方法中都new一个还是很麻烦的,所以可以封装一下:

public class ResultVoUtil {
    /** 成功时使用 */
    public static ResultVo success(Object object){
        ResultVo resultVo = new ResultVo();
        resultVo.setData(object);
        resultVo.setCode(0);
        resultVo.setMsg("成功");
        return resultVo;
    }

    /** 成功时且不需要返回值时使用 */
    public static ResultVo success(){
        return success(null);
    }

    /** 请求错误时使用 */
    public static ResultVo error(Integer code,String msg){
        ResultVo resultVo = new ResultVo();
        resultVo.setCode(code);
        resultVo.setMsg(msg);
        return resultVo;
    }
}

那么上面的controller就可以改成:

 @GetMapping("/test")
    public ResultVo test() {
        ProductVo productVo = new ProductVo();
        ProductInfoVo productInfoVo = new ProductInfoVo();

        productInfoVo.setProductName("商品1");
        productVo.setProductInfoVoList(Arrays.asList(productInfoVo));
        productVo.setCategoryName("类目1");

        return ResultVoUtil.success(Arrays.asList(productVo));
    }

链接:https://www.jianshu.com/p/32420dbdd7fb
来源:简书

  • 12
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值