在项目中我们往往会规定后台向前端传输数据的格式,比如下面这个
{
"code": 0,
"msg": "成功",
"data": {
"***": "****"
...
}
}
最外层有三个字段,code,msg,和data,全部主要数据都放进data里,这样更加的规范可控
1.创建一个用于返回的类 ResultVO
/**
* http请求返回的最外层对象
* @author: 林之谦
* @date: 2018/7/27
* @description:
*/
@Data
//@JsonInclude(JsonInclude.Include.NON_NULL)
public class ResultVO<T> implements Serializable {
private static final long serialVersionUID = 1451589387303987463L;
/** 错误码 */
private Integer code;
/** 提示信息 */
private String msg;
/** 返回的具体内容 */
private T data;
}
2.创建一个枚举类,用于规定返回的结果的类型 ResultEnum
/**
* @author: 林之谦
* @date: 2018/7/27
* @description:
*/
@Getter
public enum ResultEnum {
SUCCESS(0,"成功"),
PARAM_ERROR(1,"参数不正确"),
PRODUCT_NOT_EXIST(10,"商品不存在"),
PRODUCT_STOCK_ERROR(11,"商品库存不正确"),
ORDER_NOT_EXIST(12,"订单不存在"),
ORDERDETAIL_NOT_EXIST(13,"订单详情不存在"),
ORDER_STATUS_ERROR(14,"订单状态不正确"),
ORDER_UPDATE_FAIL(15,"订单更新失败"),
ORDER_DETAIL_EMPTY(16,"订单详情为空"),
ORDER_PAY_STATUS_ERROR(17,"订单支付状态不正确"),
CAR_EMPTY(18,"购物车为空"),
ORDER_OWNER_ERROR(19,"该订单不属于当前用户"),
WECHAT_MP_ERROR(20,"微信公众账号方面错误"),
WXPAY_NOTIFY_MONEY_VERIFY_ERROR(21,"微信支付异步通知金额校验不通过"),
ORDER_CANCEL_SUCCESS(22,"订单取消成功"),
ORDER_FINISH_SUCCESS(23,"订单完结成功"),
PRODUCT_STATUS_ERROR(24,"商品状态不正确"),
PRODUCT_ON_SALE_SUCCESS(25,"商品上架成功"),
PRODUCT_OFF_SALE_SUCCESS(26,"商品下架成功"),
LOGIN_FAIL(27,"登录失败,登陆信息不正确"),
LOGOUT_SUCCESS(28,"登出成功"),
;
private Integer code;
private String msg;
ResultEnum(Integer code, String msg) {
this.code = code;
this.msg = msg;
}
}
3.创建一个用于生成返回对象的工具类 ResultVOUtil
成功的返回就只有 0,成功 这个选择,但是失败的种类多种多样
/**
* @author: 林之谦
* @date: 2018/7/27
* @description:
*/
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;
}
}
4.创建一个ResultVO 中 data 的使用类,例如我们的data要放入产品信息的话,就创建一个 ProductInfoVO
这种VO里面的属性只填前端需要的,用@JsonProperty注解声明在Json中该属性的名字
/**
* 商品详情
* @author: 林之谦
* @date: 2018/7/27
* @description:
*/
@Data
public class ProductInfoVO implements Serializable {
private static final long serialVersionUID = 8929804736625426112L;
@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;
}
5.使用实例
/**
* @author: 林之谦
* @date: 2018/7/27
* @description:
*/
@RestController
@RequestMapping("/buyer/product")
@CacheConfig(cacheNames = "product")
public class BuyerProductController {
@Autowired
private ProductInfoService productService;
@Autowired
private ProductCategoryService categoryService;
@GetMapping("/list")
@Cacheable(key = "123",unless = "#result.getCode() != 0")
public ResultVO list(){
System.out.println("【进入数据库查询商品信息】");
// 1.查询所有的上架商品
List<ProductInfo> productInfoList = productService.findUpAll();
// 2.查询类目(一次性查询)
//传统方法
// for (ProductInfo productInfo : productInfoList){
// categoryTypeList.add(productInfo.getCategoryType());
// }
//精简的做法 (java8,lambda)
List<Integer> categoryTypeList = productInfoList.stream()
.map(e->e.getCategoryType())
.collect(Collectors.toList());
List<ProductCategory> productCategoryList = categoryService.findByCategoryTypeIn(categoryTypeList);
// 3.数据拼装
List<ProductVO> productVOList = new ArrayList<>();
for (ProductCategory productCategory : productCategoryList){
ProductVO productVO = new ProductVO();
productVO.setCategoryType(productCategory.getCategoryType());
productVO.setCategoryName(productCategory.getCategoryName());
List<ProductInfoVO> productInfoVOList = new ArrayList<>();
for(ProductInfo productInfo : productInfoList){
if(productInfo.getCategoryType().equals(productCategory.getCategoryType())){
ProductInfoVO productInfoVO = new ProductInfoVO();
BeanUtils.copyProperties(productInfo,productInfoVO);
productInfoVOList.add(productInfoVO);
}
}
productVO.setProductInfoVOList(productInfoVOList);
productVOList.add(productVO);
}
return ResultVOUtil.success(productVOList);
}
}