在使用 Spring 在对 Controller 里面传过来的参数进行校验的时候,如果不想让某个 String 类型的字段为空,那么我们可以在对应的字段上面加 @NotBlank 注解,如果不想让引用类型的字段为空,我们可以用 @NotNull 注解。这些注解都是系统里面实现好的,默认自带的。如果用户自己想定义一个注解来对相应的字段进行校验,那么我们可以自己定义一个注解,然后实现相应的逻辑。
在使用自定义注解的时候,需要引入相应的 jar 包,具体如下:
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
假如我们想对一个类进行校验,我们以定义一个 Person 为例子,代码结构如下:
我们自定义了一个 Person 类,现在想要对里面的字段进行校验,所以就定义了一个 PersonInfoValidation 注解,比如你如果想判断该用户是否存在啊,该姓名是否合法啊等等。
package net.haicoder.validate;
/**
* @author 嗨客网
* @description
*/
@PersonInfoValidation(message = "人员信息校验失败")
public class Person {
private String name;
private String phone;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
}
package net.haicoder.validate;
import javax.validation.Constraint;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import javax.validation.Payload;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
/**
* @author 嗨客网
* @description 校验 Person 相关信息
*/
@Target({TYPE})
@Retention(RUNTIME)
@Constraint(validatedBy = PersonInfoValidation.PhoneValidator.class)
public @interface PersonInfoValidation {
/**
* 这边可以标注默认的验证失败消息
*
* @return
*/
String message();
/**
* 定义组,可以用来区分版本
*
* @return
*/
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
/**
* 定义一个内部类,这边用来编写具体的校验逻辑
* Person 表示被校验的字段类型,该注解只能够放在该类型的类上面,如果想对某个 String 类型对字段进行校验,我们可以将 Person 换成 String 同理 Integer 类型 换成 Integer 就 OK 了。
*/
public class PhoneValidator implements ConstraintValidator<PersonInfoValidation, Person> {
public boolean isValid(Person person, ConstraintValidatorContext context) {
String name = person.getName();
String phone = person.getPhone();
//TODO 这边可以写自己的校验逻辑
return false;
}
}
}
我们可以看到,在 Person
的类上面加了 PersonInfoValidation
注解,在 PersonInfoValidation
里面,我们定义了一个 内部类 PhoneValidator
它实现了 ConstraintValidator
接口,里面实现了具体的验证逻辑。
在项目中,我们不想在对某些类做校验的时候,在每次调用的地方都进行校验一遍,那么我们就可以自定义注解类,在该注解类中将具体的校验逻辑写好,在需要使用的时候直接加注解就可以了。