正文
然后去找前端妹妹,跟他约定好状态码(这可能是你们唯一的约定了)枚举类嘛,当然不能有
setter
方法了,因此我们不能在用
@Data
注解了,我们要用
@Getter
;
@Getter
publicenum ResultCode implements StatusCode{
SUCCESS(1000, "请求成功"),
FAILED(1001, "请求失败"),
VALIDATE_ERROR(1002, "参数校验失败"),
RESPONSE_PACK_ERROR(1003, "response返回包装失败");
privateint code;
private String msg;
ResultCode(int code, String msg) {
this.code = code;
this.msg = msg;
}
}
3、
写好枚举类,就开始写
ResultVo
包装类了,我们预设了几种默认的方法,比如成功的话就默认传入
object
就可以了,我们自动包装成
success
;
@Data
publicclass ResultVo {
// 状态码
privateint code;
// 状态信息
private String msg;
// 返回对象
private Object data;
// 手动设置返回vo
public ResultVo(int code, String msg, Object data) {
this.code = code;
this.msg = msg;
this.data = data;
}
// 默认返回成功状态码,数据对象
public ResultVo(Object data) {
this.code = ResultCode.SUCCESS.getCode();
this.msg = ResultCode.SUCCESS.getMsg();
this.data = data;
}
// 返回指定状态码,数据对象
public ResultVo(StatusCode statusCode, Object data) {
this.code = statusCode.getCode();
this.msg = statusCode.getMsg();
this.data = data;
}
// 只返回状态码
public ResultVo(StatusCode statusCode) {
this.code = statusCode.getCode();
this.msg = statusCode.getMsg();
this.data = null;
}
}
4、
使用,现在的返回肯定就不是
returndata;
这么简单了,而是需要
newResultVo(data);
;
@PostMapping("/findByVo")
public ResultVo findByVo(@Validated ProductInfoVo vo) {
ProductInfo productInfo = new ProductInfo();
BeanUtils.copyProperties(vo, productInfo);
return new ResultVo(productInfoService.getOne(new QueryWrapper(productInfo)));
}
最后返回就会是上面带了状态码的数据了
三、统一校验
1. 原始做法
假设有一个添加
ProductInfo
的接口,在没有统一校验时,我们需要这么做
@Data
public class ProductInfoVo {
// 商品名称
private String productName;
// 商品价格
private BigDecimal productPrice;
// 上架状态
private Integer productStatus;
}
@PostMapping("/findByVo")
public ProductInfo findByVo(ProductInfoVo vo) {
if (StringUtils.isNotBlank(vo.getProductName())) {
thrownew APIException("商品名称不能为空");
}
if (null != vo.getProductPrice() && vo.getProductPrice().compareTo(new BigDecimal(0)) 0) {
thrownew APIException("商品价格不能为负数");
}
...
ProductInfo productInfo = new ProductInfo();
BeanUtils.copyProperties(vo, productInfo);
returnnew ResultVo(productInfoService.getOne(new QueryWrapper(productInfo)));
}
这if写的人都傻了,能忍吗?肯定不能忍啊
2. @Validated参数校验
好在有
@Validated
,又是一个校验参数必备良药了。有了
@Validated
我们只需要再
vo
上面加一点小小的注解,便可以完成校验功能
@Data
public class ProductInfoVo {
@NotNull(message = "商品名称不允许为空")
private String productName;
@Min(value = 0, message = "商品价格不允许为负数")
private BigDecimal productPrice;
private Integer productStatus;
}
@PostMapping("/findByVo")
public ProductInfo findByVo(@Validated ProductInfoVo vo) {
ProductInfo productInfo = new ProductInfo();
BeanUtils.copyProperties(vo, productInfo);
return new ResultVo(productInfoService.getOne(new QueryWrapper(productInfo)));
}
运行看看,如果参数不对会发生什么?