参数校验(javax.validation)学习

2023-10-27

一、应用场景

页面表单有很多字段需要提交,因此使用注解校验的方式针对pojo的属性进行校验 因此使用javax标准以及org.hibernate的validator的注解校验

二、依赖

        <dependency>
            <groupId>javax.validation</groupId>
            <artifactId>validation-api</artifactId>
            <version>1.1.0.Final</version>
        </dependency>

 javax的validation是Java定义的一套基于注解的数据校验规范,目前已经从JSR 303的1.0版本升级到JSR 349的1.1版本,再到JSR 380的2.0版本(2.0完成于2017.08),已经经历了三个版本。JSR只是一项标准,它规定了一些校验注解的规范,但没有实现,比如@Null、@NotNull、@Pattern等,它们位于 javax.validation.constraints这个包下。

而hibernate validator是对这个规范的实现,并增加了一些其他校验注解,如 @NotBlank、@NotEmpty、@Length等,它们位于org.hibernate.validator.constraints这个包下

 项目使用了Spring Boot,hibernate validator框架已经集成在 spring-boot-starter-web中,所以无需再添加其他依赖。如果不是SpringBoot项目需要引入。

        <!-- hibernate validator-->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>5.2.0.Final</version>
        </dependency>

三、注解说明

1.正则表达式@Pattern注解只用于String类型的字段上。数字类型的可用@Range注解。
2.需要在Controller中请求对象或者参数前加@Validated或@Valid注解一起使用


@Validated和@Valid注解区别不是很大,一般情况下任选一个即可,区别如下:

 

注解 @Validated  @Valid
所属的包  属于org.springframework.validation.annotation包下的,是spring提供的 属于javax.validation包下,是jdk给提供的
是否支持分组和排序


虽然@Validated比@Valid更加强大,在@Valid之上提供了分组功能和验证排序功能,不过在实际项目中一直没有用到过 。Hibernate-validate框架中的注解是需要加在实体中一起使用的


四、代码实现

package cc.jz.basic.domain;

import cc.jz.common.annotation.Dict;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.ToString;

import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.io.Serializable;

/**
 * @Description: JzIsolationTec实体类
 * @Author: wj
 * @CreateDate: Created in  2022-01-20 17:42:32
 * @Modify By:
 * @Version: 1.0
 */
@Data
@ToString
public class JzIsolationTec implements Serializable {
    private static final long serialVersionUID = 436485683104282899L;

    /**
     * 工艺ID
     */
    private Integer id;

    /**
     * 产品规格
     */
    @NotBlank(message = "产品规格不能为空")
    @Size(min = 0, max = 32, message = "产品规格长度不能超过32个字符")
    private String productSpec;

    /**
     * 测试电压
     */
    @Min(0)
    private Integer testVoltage;

    /**
     * 测试时长
     */
    @Min(0)
    private Integer testDura;

    /**
     * 充电时长
     */
    @Min(0)
    private Integer chargeDura;

    /**
     * 放电时长
     */
    @Min(0)
    private Integer dischDura;

    /**
     * 基准阻值
     */
    @Min(0)
    private Integer refResist;

    /**
     * 基准阻值单位
     */
    @NotNull(message = "基准阻值单位不允许为空")
    @Dict(type = "resist_unit")
    private Integer resistUnit;

    /**
     * 执行标准
     */
    @NotBlank(message = "执行标准不能为空")
    @Size(min = 0, max = 50, message = "产品规格长度不能超过32个字符")
    private String execStd;

    /**
     * 工序名称id
     */
    @NotNull(message = "工序名称不允许为空")
    @Dict(type = "process_id")
    private Integer processId;
}
    @Log(title = "新增JzIsolationTec", businessType = BusinessType.INSERT)
    @PostMapping
    public AjaxResult add(@Validated @RequestBody JzIsolationTec jzIsolationTec) {
        return toAjax(jzIsolationTecService.insertJzIsolationTec(jzIsolationTec));
    }

五、自定义注解

package cc.jz.common.annotation;

import cc.jz.common.valid.DictValidator;

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

/**
 * @Description:
 * @Author: wj
 * @CreateDate: 11:30 2022/1/26
 * @Modify By:
 * @Version: 1.0.0
 */
@Documented
// 标明这个校验注解是使用哪个校验器进行校验的,在这里指定或者在初始化的时候指定
@Constraint(validatedBy = {DictValidator.class})
@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})  // 作用位置
@Retention(RUNTIME)  // 运行时机
public @interface Dict {
    String type() default "";

    //    必须要,否则会报错
    String message() default "请检查业务数据字典是否正确配置";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}
@Constraint指定校验器时,注释上说也可以初始化指定,但是我一直没有找到方法,如果有哪位大佬清楚的,告知下我,感激不尽。
package cc.jz.common.valid;

import cc.jz.common.annotation.Dict;
import cc.jz.common.utils.ServiceDictUtil;
import lombok.extern.slf4j.Slf4j;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

/**
 * @Description:
 * @Author: wj
 * @CreateDate: 11:36 2022/1/26
 * @Modify By:
 * @Version: 1.0.0
 */
@Slf4j
public class DictValidator implements ConstraintValidator<Dict, Integer> {

    private String type;

    @Override
    public void initialize(Dict constraintAnnotation) {
        this.type = constraintAnnotation.type();
    }

    @Override
    public boolean isValid(Integer value, ConstraintValidatorContext context) {
        if (value != null) {
            String dictLabel = ServiceDictUtil.getServiceDictLabel(this.type, value);
            if (dictLabel == null || "".equals(dictLabel)) {
                return false;
            }
        }
        return true;
    }
}

代码实现中使用了这个@Dict(type = "dev_type")。开发人员配置成数据字典类型,前端传Dict的值,通过这个注解进行检验。一定要加在是数据字典的字段上。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

参数校验(javax.validation)学习 的相关文章

随机推荐

  • 【linux】基本工具gcc/g++及Makefile

    文章目录 一 程序翻译过程 1 程序的翻译过程 2 理解选项的含义 3 动态链接与静态链接 二 Linux项目自动化构建工具 make Make le 1 背景 2 实例说明 3 原理 4 语法 5 为什么gcc不更新文件 6 推导规则 三
  • eclipse svn 忽略文件夹

    以忽略 target 文件夹为例 window gt preferences gt team gt Ignored Resource gt Add Pattern gt 新建一个 target gt ok 再次同步可见traget下所有文件
  • 2023华为OD机试真题Java实现【食堂供餐/二分法】

    题目内容 某公司员工食堂以盒饭方式供餐 为将员工取餐排队时间降低为0 食堂的供餐速度必须要足够快 现在需要根据以往员工取餐的统计信息 计算出一个刚好能达成排队时间为0的最低供餐速度 即 食堂在每个单位时间内必须至少做出多少份盒饭才能满足要求
  • 假如让你来设计SSL/TLS协议

    前言 说起网络通信协议 相信大家对 TCP 和 HTTP 都很熟悉 它们可以说是当今互联网通信的基石 但是 在网络安全方面 它们却是有着很大安全风险 窃听风险 第三方攻击者可以随意窃听通信内容 比如获取支付账号密码 冒充风险 第三方攻击者可
  • 在 WSL2 上部署 PyTorch

    开发项目需要使用AI 但是我习惯用 VMware 来开发各类项目 于是查到 Enable NVIDIA CUDA on WSL 可以实现 CUDA VGPU 的功能 但是国内对这类资料较少 我就想顺便补个空白 在 WSL2 上部署 PyTo
  • <金融产品>京东金融2015年战略主攻三大方向:股权众筹、农村金融和校园金融...

    导读 2014年是京东金融全力奔跑的一年 2015年京东金融业务将会在三个方面发力 上线股权众筹平台 发力农村金融和校园金融 2014年 凭借京东白条 京保贝 京东众筹等产品 京东金融迅速在互联网金融领域占领一席之地 京东CEO刘强东对京东
  • 阅读论文的方法

    清单一 系统阅读论文的方法 1 试着找个安静的地方呆上几个小时 拿上你最喜欢的饮料 可能是咖啡 茶 或者别的什么东西 我经常在咖啡厅里工作 2 从阅读标题和摘要开始 目的是获得论文的高层次概述 作者的主要目标是什么 以及一些实验结果 摘要通
  • 华为OD机试真题B卷 Java 实现【计算礼品发放的最小分组数目】,附详细解题思路

    一 题目描述 又到了一年的末尾 项目组让小明负责新年晚会的小礼品发放工作 为使得参加晚会的同时所获得的小礼品价值相对平衡 需要把小礼品根据价格进行分组 但每组最多只能包括两件小礼品 并且每个分组的价格总和不能超过一个价格上限 为了保证发放小
  • npm WARN enoent ENOENT: no such file or directory, open 'C:\Users\licc\package.json'

    问题描述 在项目中使用npm安装gulp时报异常 node modle文件夹出不来 异常输出如下 npm WARN enoent ENOENT no such file or directory open C Users licc pack
  • yolov5+opencv+java:通过DJL在maven项目中使用yolov5的小demo

    目录 前言 环境 导出yolov5s模型 编写Maven项目 编写pom xml文件 引入opencv依赖 下载opencv 获取opencv的jar包和动态链接库dll文件 将lib文件夹添加为Library 将yolov5权重文件放到资
  • C 中strcpy和memcpy的区别

    参考博客 https blog csdn net zcyzsy article details 53190691 https www cnblogs com metootxy p 3185000 html 一 以下是具体使用memcpy这个
  • 浅谈 Computed和Watch的区别

    computed 计算属性 类似于过滤器 对绑定到试图的数据进行处理 并监听变化进而执行对应的代码 基于它的依赖缓存 只有相关依赖发生改变时才会重新取值 而使用methods时 在重新渲染的时候 函数总会重新调用执行 computed属性默
  • Linux 虚拟化网络技术 — 虚拟网线(Veth-pair)

    虚拟网线 Veth pair Veth pair 不是一个设备 而是一对设备 作为虚拟网线用于连接两个虚拟网络设备 veth pair 是根据数据链路层的 MAC 地址对网络数据包进行转发的过程来实现的 本质是反转通讯数据的方向 需要发送的
  • C++Easyx教程(一)——如何在DEV-C++里安装Easyx库

    本文作者 C 橙羊 本文代码适合编译环境 DEV C 温馨提示 此文乃作者心血 如要转载请标注版权 否则视为抄袭 今天就算是我们Easyx教程的第一篇博文的诞生日了 那么今天橙羊就教大家如何在DEV C 里安装Easyx图形库 这里我用的是
  • 电子学会青少年C语言一级通过

    复习一级时 看了很多printf格式 整型 浮点型之类的问题 这就是考级 什么都考 覆盖面广 但考完不一定常用 计划继续报二级 主要考数组和字符串 三级开始考算法 其实可以考虑跨级报考 因为感觉每个级的内容相对独立 有人考了一级就考四级 五
  • 蛋白质结构域的概念_怎么查询蛋白质的全部信息 UniProKB数据库

    今天给大家介绍一个数据库 UniProKB数据库 网址http www uniprot org 这个数据库对于查询蛋白质相关信息还是很全面的 比如我们想要查询人类p53蛋白的主要功能 结构域 翻译后的修饰和参与的代谢途径 以及与它相互作用的
  • HTTP1.0和HTTP1.1

    什么是HTTP http是一个超文本传输协议 它是基于TCP协议的应用层传输协议 简单点说就是客户端和服务端进行数据传输的一种规则 http是一个无状态协议 它本身不会对发送过得请求和响应的通信状态进行持久化处理 这样做的目的是为了保持ht
  • 高效扩展性的全新Apple Mac Pro:专为专业工作流程与编程而设计

    随着科技的不断发展和专业工作需求的增加 全新的Apple Mac Pro应运而生 这款Mac Pro具备卓越的性能和出色的扩展功能 为专业人士提供了一个强大的工作平台 本文将探讨Mac Pro的特点 并提供一些适用于专业工作流程和编程的源代
  • 原生js实现分页功能

    原生就是实现分页功能 代码如下 var pagination function option fun this parentId option id 容器 this pageSize option pageSize 1 每页显示多少条 th
  • 参数校验(javax.validation)学习

    一 应用场景 页面表单有很多字段需要提交 因此使用注解校验的方式针对pojo的属性进行校验 因此使用javax标准以及org hibernate的validator的注解校验 二 依赖