Spring自定义验证器

在使用 Spring 在对 Controller 里面传过来的参数进行校验的时候,如果不想让某个 String 类型的字段为空,那么我们可以在对应的字段上面加 @NotBlank 注解,如果不想让引用类型的字段为空,我们可以用 @NotNull 注解。这些注解都是系统里面实现好的,默认自带的。如果用户自己想定义一个注解来对相应的字段进行校验,那么我们可以自己定义一个注解,然后实现相应的逻辑。

案例

在使用自定义注解的时候,需要引入相应的 jar 包,具体如下:

<dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>2.0.1.Final</version> </dependency>

假如我们想对一个类进行校验,我们以定义一个 Person 为例子,代码结构如下:

11 验证器代码结构.png

我们自定义了一个 Person 类,现在想要对里面的字段进行校验,所以就定义了一个 PersonInfoValidation 注解,比如你如果想判断该用户是否存在啊,该姓名是否合法啊等等。

Person

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; } }

PersonInfoValidation

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 接口,里面实现了具体的验证逻辑。

Spring自定义验证器总结

在项目中,我们不想在对某些类做校验的时候,在每次调用的地方都进行校验一遍,那么我们就可以自定义注解类,在该注解类中将具体的校验逻辑写好,在需要使用的时候直接加注解就可以了。