【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.mfbz.cn/a/238.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ChatGPT告诉你:项目管理能干到60岁吗?

早上好&#xff0c;我是老原。这段时间最火的莫过于ChatGPT&#xff0c;从文章创作到论文写作&#xff0c;甚至编程序&#xff0c;简直厉害的不要不要的。本以为过几天热度就自然消退了&#xff0c;结果是愈演愈烈&#xff0c;热度未减……大家也从一开始得玩乐心态&#xff0c…

python flask项目打包成docker镜像发布

1.编写python flask代码&#xff0c;简单写一个加法的接口&#xff0c;命名为sum.py import json from flask import Flask,request,render_template app Flask(__name__)app.route(/) def index():return hello worldapp.route(/sum,methods[POST]) def correct():a request…

C/C++网络编程笔记Socket

https://www.bilibili.com/video/BV11Z4y157RY/?vd_sourced0030c72c95e04a14c5614c1c0e6159b上面链接是B站的博主教程&#xff0c;源代码来自上面视频&#xff0c;侵删&#xff0c;这里只是做笔记&#xff0c;以供复习和分享。上一篇博客我记录了配置环境并且跑通了&#xff0…

Nginx——Nginx的优化设计

摘要 本博文介绍Nginx的优化设计方向和原理&#xff0c;帮助大家在nginx的使用和优化中提供一个参考的方向&#xff0c;让你的nginx发挥最大性能&#xff0c;节约系统资源。 一、Nginx开启Http2.0的优化 HTTP/2是HTTP协议的最新标准&#xff0c;它是HTTP/1.1的继承者。由于它…

大厂与小厂招人的区别,看完多少有点不敢相信

前两天在头条发了一条招人的感慨&#xff0c;关于大厂招人和小公司招人的区别。 大厂&#xff1a;有影响力&#xff0c;有钱&#xff0c;能够吸引了大量的应聘者。因此&#xff0c;也就有了筛选的资格&#xff0c;比如必须985名校毕业&#xff0c;必须35岁以下&#xff0c;不能…

数据结构与算法这么难,为什么我们还要学习?

文章目录前言1. 数据结构与算法是什么&#xff1f;2. 为什么数据结构与算法很难&#xff1f;3. 如何系统学习数据结构与算法&#xff1f;&#x1f351; 复杂度&#x1f351; 线性表&#x1f351; 树形结构&#x1f351; 图&#x1f351; 排序&#x1f351; 字符串&#x1f351;…

【c++】:模拟实现STL模板中的string

文章目录 前言一.string的模拟实现总结前言 上一篇文章我们详细介绍了STL中的string的一些常用的接口&#xff0c;这一篇文章我们将从底层实现string类&#xff0c;当然我们只是实现一些重要的&#xff0c;经常使用的接口&#xff0c;并且不是完全按照STL中的string去走的。 一…

对于从事芯片行业的人来说,有哪些知识是需要储备的?

近两年芯片行业大火&#xff0c;不少同学想要转行&#xff0c;却不知道该如何下手&#xff0c;需要学习哪些基础知识&#xff0c;下面就来看看资深工程师怎么说&#xff1f; 随着工艺的发展&#xff0c;芯片肯定是尺寸越来越小&#xff0c;至于小到什么样的程度是极限&#xf…

【小破站下载工具】Python tkinter 实现网站下载工具,所有数据一键获取

目录前言开发环境本次项目案例步骤先展示下完成品的效果界面导入模块先创建个窗口功能按键主要功能代码编写功能一功能二功能三前言 最近很多同学想问我&#xff0c;怎么把几个代码的功能集合到一起&#xff1f; 很简单&#xff0c;写一个界面就行了&#xff0c;想要哪个代码…

CSS的三大特性

&#x1f31f;所属专栏&#xff1a;前端只因变凤凰之路&#x1f414;作者简介&#xff1a;rchjr——五带信管菜只因一枚&#x1f62e;前言&#xff1a;该系列将持续更新前端的相关学习笔记&#xff0c;欢迎和我一样的小白订阅&#xff0c;一起学习共同进步~&#x1f449;文章简…

用ChatGPT生成Excel公式,太方便了

ChatGPT 自去年 11 月 30 日 OpenAI 重磅推出以来&#xff0c;这款 AI 聊天机器人迅速成为 AI 界的「当红炸子鸡」。一经发布&#xff0c;不少网友更是痴迷到通宵熬夜和它对话聊天&#xff0c;就为了探究 ChatGPT 的应用天花板在哪里&#xff0c;经过试探不少人发现&#xff0c…

vue3+vite项目移动端适配:postcss-pxtorem和amfe-flexible

一&#xff0c;定义 postcss-pxtorem PostCSS 的一个插件&#xff0c;可以从像素单位生成 rem 单位。 amfe-flexible amfe-flexible是配置可伸缩布局方案&#xff0c;主要是将1rem设为viewWidth/10。 二&#xff0c;使用 1. 设置 viewport 在 index.html 中&#xff1a; &l…

学生信息表

目录 一、功能说明 二、核心思想 三、所用知识回顾 四、基本框架 五、js功能实现部分 一、功能说明 &#xff08;1&#xff09;输入对应的信息&#xff0c;点击录入可以为下面的表格添加一条记录&#xff0c;注意当所填信息不完整时不允许进行提交。 &#xff08;2&…

UE实现建筑生长(材质遮罩方式)效果

文章目录 1.实现目标2.实现过程2.1 遮罩2.2 生长动画3.参考资料1.实现目标 在UE中实现建筑的生成动画效果,GIF动图如下: 2.实现过程 通过动态设置材质遮罩OpacityMask的参数,即通过材质方式来实现建筑生长效果 2.1 遮罩 现有的教程中大多通过BoxMask-3D材质节点实现,但是…

扫地机器人(蓝桥杯C/C++)

题目描述 小明公司的办公区有一条长长的走廊&#xff0c;由 NN 个方格区域组成&#xff0c;如下图所示。 走廊内部署了 KK 台扫地机器人&#xff0c;其中第 ii 台在第 A_iAi​ 个方格区域中。已知扫地机器人每分钟可以移动到左右相邻的方格中&#xff0c;并将该区域清扫干净。…

Linux信号

目录 信号入门 1. 生活角度的信号 2. 技术应用角度的信号 3. 注意 4. 信号概念 5. 用kill -l命令可以察看系统定义的信号列表 6. 信号处理常见方式概览 产生信号 1. 通过终端按键产生信号 2. 调用系统函数向进程发信号 3. 由软件条件产生信号 4. 硬件异常产生信号 核…

DHCP原理简析及交互实践

环境&#xff1a; os&#xff1a;centos7 dnsmasq&#xff1a;version 2.76 一. dhcp工作原理 首先补充几个dhcp相关的基本概念&#xff1a; 1、动态主机配置协议DHCP&#xff08;Dynamic Host Configuration Protocol&#xff09;是一种网络管理协议&#xff0c;用于集中对用…

程序员必会技能—— 使用日志

目录 1、为什么要使用日志 2、自定义日志打印 2.1、在程序中得到日志对象 2.2、使用日志对象打印日志 2.3、日志格式 3、日志的级别 3.1、日志级别的分类 3.2、日志级别的设置 4、持久化日志 5、更简单的日志输出——lombok 5.1、如何在已经创建好的SpringBoot项目中添加…

Python+ChatGPT实战之进行游戏运营数据分析

文章目录一、数据二、目标三、解决方案1. DAU2. 用户等级分布3. 付费率4. 收入情况5. 付费用户的ARPU最近ChatGPT蛮火的&#xff0c;今天试着让ta写了一篇数据分析实战案例&#xff0c;大家来评价一下&#xff01;一、数据 您的团队已经为您提供了一些游戏数据&#xff0c;包括…

MySQL数据库的基础语法总结(1)

MySql一.数据库,数据表的基本操作1.数据库的基本操作2. 数据表的基本操作2.1 数据库的数据类型2.1.1 整数类型2.1.2 浮点数类型和定点数类型2.1.3 字符串类型2.1.4 日期与时间类型2.2 数据表的基本操作2.2.1 创建一个数据表2.2.2 查看数据表2.2.3 查看表的基本信息的MySQL指令2…