当前位置: 首页 > article >正文

【Java实战】不会还有人用if else进行参数校验吧

当请求参数很多,几乎每一个参数都需要后端去兜底校验时,你还在写if else去判断参数是否为空吗??要校验为空的参数三四个还好,要是十几个,业务逻辑还没开始就写二三十行代码开始堆山了嘛,教给大家一个简单实用的方法,让大家不再在屎堆上堆代码。

注解篇

先来了解几个常用的注解

注解含义怎样使用
@NotBlank字符串不为null且非空格长度至少为1注解在String类型的参数上
@Null必须为null用于Long、Integer、BigDecimal基本数据类型上
@NotNull必须不为null用于Long、Integer、BigDecimal基本数据类型上
@NotEmpty集合不为null且长度>0用于集合校验
@AssertTrue为true用于Boolean类型上
@AssertFalse为false用于Boolean类型上
@Max小于或等于某个数一个字段的最大值为xx
@Min大于或等于某个数一个字段的最小值为xx
@Digits(integer=3, fraction=2)整数和小数长度
@Pattern正则匹配手机号规则校验等
@Range(min=,max=)数值类型范围
@Length字符串长度范围----

实战篇

请求参数

BizRequestDTO

import lombok.Data;
import org.hibernate.validator.constraints.NotBlank;

import javax.validation.Valid;
import java.util.Date;
import java.util.List;

@Data
public class BizRequestDTO {
    /**
     * 单据编号
     */
    @NotBlank(message = "headId (单据编号)不能为空")
    private String headId;

	/**
     * 金额
     */
    @NotNull(message = "amount (金额)不能为空")
    private BigDecimal amount;


    /**
     * 提单人
     */
    @Valid
    private EmpInfoDTO submitter;

    /**
     * 分摊人列表
     */
    @Valid
    private List<EmpInfoDTO> expenseSharerList;
}

注解释义 @Valid

作用于对象,作用于集合 对象内校验方式:

    @Valid
    private EmpInfoDTO submitter;

EmpInfoDTO

    /**
     * 工号
     */
    @NotBlank(message = "工号不能为空")
    private String workNo;

    /**
     * 姓名
     */
    @NotBlank(message = "姓名不能为空")
    private String nickName;

在代码中如何写?

引入依赖

        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>6.0.16.Final</version>
        </dependency>
        <dependency>
            <groupId>javax.validation</groupId>
            <artifactId>validation-api</artifactId>
            <version>2.0.1.Final</version>
        </dependency>

引入一个工具类

import org.hibernate.validator.HibernateValidator;

import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import java.util.Set;

public class ValidatorUtils {

    private static final Validator DEFAULT_VALIDATOR;
    static {
        DEFAULT_VALIDATOR = Validation.byProvider(HibernateValidator.class)
                .configure()
                .buildValidatorFactory()
                .getValidator();
    }

    public static <T> Set<ConstraintViolation<T>> validate(T bean) {
        return DEFAULT_VALIDATOR.validate(bean);
    }
}

实际应用

    public ResponseResult<String> checkExpenseParams(RequestParamDTO requestDTO) {
        Set<ConstraintViolation<TaeExpenseLineCheckRequestDTO>> result = ValidatorUtils.validate(requestDTO);
        // 错误信息输出
        StringBuilder resultInfo = new StringBuilder();
        result.forEach(validateResult -> resultInfo.append(validateResult.getMessage()).append("\n"));
        if (StringUtils.isNotBlank(resultInfo)) {
            return ResponseResult.error(resultInfo.toString());
        }
        // 若为空则参数校验通过
        return ResponseResult.ok(null);
    }

输出示例

headId (单据编号)不能为空
amount (金额)不能为空

校验模式配置

Hibernate可以对校验模式的配置,支持快速失败,即在校验的过程中只要有一项不同过,剩余的参数就不再进行校验。默认使用的是全部校验完成后再返回,也就是在上面的例子中展示的那样。开启快速失败的具体的实现方式:

Validation.byProvider(HibernateValidator.class)
        .configure()
        .failFast(true)
        .buildValidatorFactory()
        .getValidator();

校验工具类

import org.hibernate.validator.HibernateValidator;

import javax.validation.ConstraintViolation;
import javax.validation.Validator;
import javax.validation.Validation;
import java.util.Set;

public class ValidatorUtils {

    private static final Validator DEFAULT_VALIDATOR;

    private static final Validator FAST_VALIDATOR;

    static {

     DEFAULT_VALIDATOR = Validation.byProvider(HibernateValidator.class)
                .configure()
                .buildValidatorFactory()
                .getValidator();


        FAST_VALIDATOR = Validation.byProvider(HibernateValidator.class)
                .configure()
                .failFast(true)
                .buildValidatorFactory()
                .getValidator();
    }

    public static <T> Set<ConstraintViolation<T>> validate(T bean) {
        return DEFAULT_VALIDATOR.validate(bean);
    }

	public static <T> Set<ConstraintViolation<T>> fastValidate(T bean) {
        return FAST_VALIDATOR.validate(bean);
    }
}

快速校验使用方式同上,输出示例

headId (单据编号)不能为空

对象级联校验

包含级联对象的类

对象级联校验意味着,在一个对象中的属性可以包含另外一个校验对象,被级联的对象需要用@Valid注解修饰。上面也有给出🌰,本节再详细讲解一下。

例:

import lombok.Data;
import org.hibernate.validator.constraints.NotBlank;
import org.hibernate.validator.constraints.Range;

import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;

@Data
public class ValidatorWithDefineExtraModel {

    @NotBlank(message="姓名不能为空")
    private String name;

    @NotNull(message = "年龄不能为空")
    @Range(min=1, max=200, message = "年龄必须大于1小于200")
    private Integer age;

    @NotBlank(message="性别不能为空")
    @Pattern(regexp = "([FM])", message = "性别只能为F(女)或者M(男)")
    private String sex;

    @NotNull(message = "validatorModelExtra不能为空")
    @Valid
    private ValidatorModelExtra validatorModelExtra;
}

被级联的对象

@Data
public class ValidatorModelExtra {
    @NotNull(message = "地址不能为空")
    @Length(max = 100, message = "地址长度不能大于100个字符")
    private String address;
}

输出示例:

地址不能为空


http://www.kler.cn/a/291.html

相关文章:

  • overleaf写学术论文常用语法+注意事项+审阅修订
  • C++并发编程之内存顺序一致性
  • docker 安装influxdb
  • 设计模式 创建型 单例模式(Singleton Pattern)与 常见技术框架应用 解析
  • TVS二极管选型【EMC】
  • 2024年度总结答疑
  • linux进程管理
  • 代码规范(C++)
  • 【拳打蓝桥杯】最基础的数组你真的掌握了吗?
  • 利用Postman的简单运用解决小问题的过程
  • 2023年中国高校计算机大赛-团队程序设计天梯赛(GPLT)上海理工大学校内选拔赛(同步赛) A — E
  • 蓝桥杯刷题第十天
  • 前端安全:如何保障 Web 应用程序的安全性?
  • leetcode刷题 | 关于前缀树的题型总结
  • 世界顶级五大女程序媛,不仅技术强还都是美女
  • 第十二届蓝桥杯省赛详解
  • 【Android -- 软技能】聊聊程序员的软技能
  • 从大专到测开,上海某字母站大厂的面试题,岗位是测开(25K*16)
  • 如何一眼分辨是C还是C++
  • 【JavaSE】类和对象的详解
  • 8大主流编程语言的适用领域,你可能选错了语言
  • linux目录/usr/lib/systemd/system目录详解
  • 前端小技巧
  • python flask项目打包成docker镜像发布
  • IO流之 File 类和字节流
  • 当我尝试问了chatGPT几个问题之后,我感到了危机......