目录
自定义校验注解的实现
注意:
首先,我们需要自定义一个校验注解:
注解含义:
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = PhoneValidator.class)
校验注解逻辑实现类:
使用自定义校验注解:
控制器方法:
有时候我们在接收前端产给我们数据的时候需要进行一些校验,部分校验可以通过已有的注解进行直接使用,但是仍存在一些需求是现有注解没有提供的,所以就需要我们自定义校验注解来实现我们需要的功能,那接下来就来看看自定义校验注解是怎么实现的吧~
要实现一个自定义校验注解,主要是有两步。一是注解本身,二是校验逻辑实现类。
首先,我们来看一下校验注解的一个流程:
自定义校验注解的实现
现在我们以校验传过来的参数是否为正整数来实现自定义校验注解。
如下,我的实体类中有这样一个字段:(此处不能直接将类型设置为int型,不然前面无论传来什么值都会将其值修改为一个整型,会破坏数据的真实性)
注意:
1、此处不能直接使用@Pattern注解,因为这个注解只试用在类型为String的参数上;
2、不能使用@Digits注解,@Digits(integer = 1, fraction = 0, message = "数据精度只能是非负整数")
// integer = 3: 这意味着数字的整数部分应该有3位。换句话说,该数字应该是一个千位数。 //fraction = 0: 这意味着数字的小数部分应该为0。换句话说,该数字应该是一个整数,而不是一个带有小数部分的数。 //message = "数据精度只能是非负整数": 这是在验证失败时显示的消息。在本例中,如果提供的数字不符合指定的精度要求,则会返回这条消息。
这个注解或根据你的要求自动将你传来的值进行四舍五入成整型。
首先,我们需要自定义一个校验注解:
import com.datacommon.ParameterValidation.NonNegativeIntegerValidator;
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
//校验字段必须为非负整数
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = NonNegativeIntegerValidator.class)
public @interface IntegerParam {
String message() default "整数型字段必须为非负整数";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
注解含义:
@Target({ElementType.FIELD})
注解是指定当前自定义注解可以使用在哪些地方,这里仅仅让他可以使用属性上。但还可以使用在更多的地方,比如说方法上、构造器上等等。
- TYPE - 类,接口(包括注解类型)或枚举
- FIELD - 字段(包括枚举常量)
- METHOD - 方法
- PARAMETER - 参数
- CONSTRUCTOR - 构造函数
- LOCAL_VARIABLE - 局部变量
- ANNOTATION_TYPE -注解类型
- PACKAGE - 包
- TYPE_PARAMETER - 类型参数
- TYPE_USE - 使用类型
@Retention(RetentionPolicy.RUNTIME)
指定当前注解保留到运行时。保留策略有下面三种:
- SOURCE - 注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃。
- CLASS - 注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期。
- RUNTIME - 注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在。
@Constraint(validatedBy = PhoneValidator.class)
指定了当前注解使用哪个校验类来进行校验。
校验注解逻辑实现类:
import com.datacommon.ParameterValidation.paramInterface.IntegerParam;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
/**
* 自定义参数校验规则
* 校验穿进来的参数是否为非负整数
*/
public class NonNegativeIntegerValidator implements ConstraintValidator<IntegerParam, Double> {
@Override
public void initialize(IntegerParam constraintAnnotation) {
}
@Override
public boolean isValid(Double value, ConstraintValidatorContext context) {
System.out.println(value);
if(value.toString().contains(".0")){
return true;
}
return !value.toString().contains(".") && !value.toString().contains("-");
}
}
使用自定义校验注解:
使用我们自定义的校验注解就和普通的注解一样,只需要在相关字段上加上我们的注解名称就行了~
控制器方法:
记住要在使用到校验类的时候加上@Valid注解