自定义注解校验器

来源:互联网 发布:文化自信 知乎 编辑:程序博客网 时间:2024/06/14 15:20

想必大家都使用过validation框架,例如下图


框架已经给我们提供了不少的校验注解,那么如果我们有时候针对特殊情况需要自定义校验那么需要怎么做呢?

例如:我们在生成订单号的时候会根据平台的自有规则去生成,那么在查询订单的时候我们可以自定义校验来对这个传递的订单号进行校验


1:引入validationjar包

2:新建一个annotation

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.Payload;
/**
 * 自定义验证注解
 * 
 * @author Daniel
 *
 */
@Target({ElementType.METHOD, ElementType.FIELD}) //注解作用的地方,此处定位为作用与方法和字段上
@Retention(RetentionPolicy.RUNTIME)   
@Constraint(validatedBy = MyValidMethod.class)  //指定来处理验证的类
public @interface MyValid {
String message(); //这边可以标注默认的验证失败消息
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
}

3:新建上面指定的处理类

package com.example.demo.validate;


import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import org.springframework.beans.factory.annotation.Autowired;
import com.example.demo.service.UserService;


/**
 * @author Daniel
 * 
 * 自定义的注解验证方法
 * 实现ConstraintValidator<T,T>
 * 两个泛型类型为:
 * 第一个:你自定义的注解
 * 第二个:传递的值例如你定义在field字段上,那么这个类型就是你定义注解的那个字段类型
 * ConstraintValidator<MyValid, Object>
 * 
 * 在这边只要实现了ConstraintValidator<T,T>,那么你的这个方法就会被spring容器纳入管理
 * 因此你就可以很方便的在这个验证方法中注入spring管理的类去进行业务逻辑验证
 *
 */
public class MyValidMethod implements ConstraintValidator<MyValid, Object> {

@Autowired
private UserService userService;

/**
* 初始化方法

*/
@Override
public void initialize(MyValid constraintAnnotation) {
System.out.println("自定义验证初始化");
}


/**
* 验证方法
* 验证成功返回: true
* 验证失败返回: false
*/
@Override
public boolean isValid(Object value, ConstraintValidatorContext context) {
userService.sayHello(value.toString());
return false;
}
}

4:在需要验证的字段上添加自定义的注解


5:新建controller方法


6:执行test测试,这边把username传递为空会出现校验提示(这边在校验处理类中直接返回的false校验不过,实际情况结合业务去处理)


原创粉丝点击