介绍:
在项目开发中,实体参数效验经常用到,例如在导入,参数传递,不仅仅是数据安全,还是保证系统的健壮性.
后端参数校验通常是是直接在业务方法里面进行逻辑判断,执行具体的业务。但这样带给我们的是代码的耦合,冗余。当我们多个地方需要校验时,我们就需要在每一个地方调用校验程序,导致代码很冗余,且不美观。
在做导入时,效验表格实体时应用到了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; }
自定义注解:
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