Java Bean Validation注解效验详解

介绍:

在项目开发中,实体参数效验经常用到,例如在导入,参数传递,不仅仅是数据安全,还是保证系统的健壮性.

后端参数校验通常是是直接在业务方法里面进行逻辑判断,执行具体的业务。但这样带给我们的是代码的耦合,冗余。当我们多个地方需要校验时,我们就需要在每一个地方调用校验程序,导致代码很冗余,且不美观。

在做导入时,效验表格实体时应用到了Hibernate Validator 校验工具,Hibernate validator 在JSR303的基础上对校验注解进行了扩展,如果效验注解仍不满足业务的效验规则还可以自定义校验注解。效验注解如下

扩展注解: 

 

先引入依赖

<!--jsr 303-->
<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
    <version>2.0.1.Final</version>
</dependency>
<!-- hibernate-validator -->
<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>6.0.7.Final</version>
</dependency>

实际应用:

@Data
@ExcelTarget(value ="ImportUserBean" )
public class ImportUserBean {

    /**
     * 姓名  长度在32位以内
     */
    @NotEmpty(message = "姓名不能为空")
    @Length(min = 1, max = 32, message = "姓名长度在32位以内")
    @Excel(name = "*姓名", orderNum = "1", width = 20)
    private String userName;

    /**
     * 登录id 20位以内的字母和数字
     */
    @NotEmpty(message = "登录id不能为空")
    @Pattern(regexp = "^[0-9a-zA-Z]{1,20}$", message = "登录id是20位以内的字母和数字")
    @Excel(name = "*登录id", orderNum = "2", width = 20)
    private String loginName;

    /**
     * 工号  在1-16位重数字
     */
    @NotEmpty(message = "工号不能为空")
    @Pattern(regexp = "^\\d{1,16}$", message = "工号只能介于1-16位的数字")
    @Excel(name = "*工号", orderNum = "3", width = 20)
    private String userCode;

    /**
     * 职位     是否和系统匹配  普通职员,中层,部门经理,管理层
     */
    @NotEmpty(message = "职位不能为空")
    @Pattern(regexp="普通职员|中层|部门经理|管理层", message = "职位选择错误")
    @Excel(name = "*职位", orderNum = "4", width = 10)
    private String position;


    /**
     * 组织名称
     */
    @NotEmpty(message = "组织不能为空")
    @Excel(name = "*组织", orderNum = "5", width = 35)
    private String organizationName;


    /**
     * 性别  0男 1女 replace = { "男_0", "女_1" }
     */
    @NotEmpty(message = "性别填写错误")
    @Excel(name = "性别", orderNum = "9", width = 10)
    private String sex;


    /**
     * 区域名称
     */
    @NotEmpty(message = "区域不能为空")
    @Excel(name = "*区域", orderNum = "6", width = 25)
    private String areaName;

    /**
     * 邮箱
     */
    @NotEmpty(message = "电子邮件不能为空")
    @Email(message = "电子邮件格式不正确")
    @Excel(name = "*电子邮件", orderNum = "8", width = 25)
    private String email;

    /**
     * 手机
     */
    @NotEmpty(message = "手机不能为空")
    @Pattern(regexp = "^1\\d{10}$" ,message="手机格式错误")
    @Excel(name = "*手机", orderNum = "7", width = 20)
    private String mobile;

    /**
     * 电话
     */
    @Excel(name = "联系电话", orderNum = "10", width = 20)
    private String phone;

    /**
     * 描述
     */
    @Excel(name = "用户描述", orderNum = "11", width = 35)
    private String description;

}

自定义注解:

扫描二维码关注公众号,回复: 2774776 查看本文章

package com.beiyan.validate.annotation;

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;

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

/**
 * 自定义参数校验注解
 * 校验 List 集合中是否有null 元素
 */

@Target({ElementType.ANNOTATION_TYPE, ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = ListNotHasNullValidatorImpl.class)////此处指定了注解的实现类为ListNotHasNullValidatorImpl

public @interface ListNotHasNull {

    /**
     * 添加value属性,可以作为校验时的条件,若不需要,可去掉此处定义
     */
    int value() default 0;

    String message() default "List集合中不能含有null元素";

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

    Class<? extends Payload>[] payload() default {};

    /**
     * 定义List,为了让Bean的一个属性上可以添加多套规则
     */
    @Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER})
    @Retention(RUNTIME)
    @Documented
    @interface List {
        ListNotHasNull[] value();
    }
}

自定义注解实现

import org.springframework.stereotype.Service;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.List;

/**
 * 自定义注解ListNotHasNull 的实现类
 * 用于判断List集合中是否含有null元素
 */

@Service
public class ListNotHasNullValidatorImpl implements ConstraintValidator<ListNotHasNull, List> {

    private int value;

    @Override
    public void initialize(ListNotHasNull constraintAnnotation) {
        //传入value 值,可以在校验中使用
        this.value = constraintAnnotation.value();
    }

    public boolean isValid(List list, ConstraintValidatorContext constraintValidatorContext) {
        for (Object object : list) {
            if (object == null) {
                //如果List集合中含有Null元素,校验失败
                return false;
            }
        }
        return true;
    }

}

添加实体bean,字段上

  @NotEmpty(message = "所拥有书籍不能为空")
    @ListNotHasNull(message = "List 中不能含有null元素")
    @Valid
    private List<Book> books;

参考博文:

https://www.cnblogs.com/beiyan/p/5946345.html

 https://blog.csdn.net/zzy1078689276/article/details/79049252

猜你喜欢

转载自blog.csdn.net/s573626822/article/details/81501880
今日推荐