我们在使用spring项目的时候,经常使用@Valid
来对入参进行校验,比如必须为空,必须不为空,长度多少,是否符合邮件格式等等,同时也可以正则。
如下图所示,
@Null(message = "id不能传入",groups = {
MyValidDTOIdNull.class})
@NotNull(message = "id必须传入",groups = {
MyValidDTOIdNotNull.class})
private String id;
@Length(min = 2, max = 3, message = "姓名长度为2")
private String name;
@Email(message = "电子邮件格式不正确")
private String email;
private Integer age;
@NotNull(message = "salary必须要存在",groups = {
MyValidDTOIdNotNull.class})
private Long salary;
然而,使用@Valid
或者@Validated
的时候,并没有对入参为指定的值限制的注解。
工作中,一般指定的值为枚举的code,或者Integer类型为0或者1等,或者String为指定值。
现在给出具体的实现代码,可以直接使用。
以下项目地址可点击:qsm-valid
给出引用的jar
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.0.Final</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
1、QsmSpecifiedSelector注解
指定值选择器,用于dto中想要校验的字段上。指明入参可以为哪些值,这些值可以为String类型,也可以为Integer类型,也可以为枚举的code。
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;
/**
* @author qxx@xx.com
* @date 2020/11/24 10:24
* @description 指定值选择器,用于需要校验的字段上
*/
@Target({
METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER})
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = {
QsmSpecifiedValidator.class})
@Repeatable(QsmSpecifiedSelector.List.class)
public @interface QsmSpecifiedSelector {
//默认错误消息
String message() default "必须为指定值";
String[] strValues() default {
};
int[] intValues() default {
};
//使用指定枚举,1、使用属性命名code。2、枚举上使用QsmSpecifiedEnumValue
Class<?> enumValue() default Class.class;
//分组
Class<?>[] groups() default {
}