专栏名称: 终码一生
提供免费JB账号,激活码,破解工具下载;分享Java开发技术(JVM,多线程,高并发,性能调优),开源项目,常见开发问题和前沿科技资讯等!
目录
相关文章推荐
天津日报  ·  打虎!胡幼桃,被查! ·  14 小时前  
天津日报  ·  刚刚,天津机场公安通报! ·  19 小时前  
天津日报  ·  三预警齐发!天津有短时强降水 ·  昨天  
天津日报  ·  刚刚!新疆地震 ·  昨天  
51好读  ›  专栏  ›  终码一生

别再乱写了,Controller 层代码这样写才足够规范!

终码一生  · 公众号  ·  · 2025-05-22 22:49

正文

请到「今天看啥」查看全文


然后去找前端妹妹,跟他约定好状态码(这可能是你们唯一的约定了)枚举类嘛,当然不能有 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)));
    }

运行看看,如果参数不对会发生什么?







请到「今天看啥」查看全文