业务场景:org.hibernate.validator包下的@Range(min = 0,max = 1,message = “”)注解的校验范围是:
0 =< param =< max
而我们需要的范围不包括0,也就是大于0,因为这个类不参与业务逻辑所以拿出来单独用if else判断比较冗余,所以打算自己写个注解来满足业务要求,废话少说,下面开始实现。
ps:我把需要导的包也一块放出来了,没有这些包的去maven仓库下载相应的依赖 一些人懒得要命,我还是直接发出来吧(•́へ•́╬)
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
/**
* @description: 自定义注解,用于判断字段是否大于0
* @fileName: MoreThanZero.java
* @author: sure
* @createAt: 2021/6/17/017 10:28
* @updateBy: sure
* @remark:
*/
@Target(FIELD)
@Retention(RUNTIME)
@Constraint(validatedBy = MoreThanZeroValidator.class)
@Documented
public @interface MoreThanZero {
String message() default "校验失败,字段不能为负";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
2.创建一个校验逻辑的类,继承ConstraintValidator,两个参数,第一个是你的注解类,第二个是需要校验的参数类别,或者用泛型表示提高可用性
/**
* @description: 校验类,用于参数非负校验
* @fileName: MoreThanZeroValidator.java
* @author: sure
* @createAt: 2021/6/17/017 14:24
* @updateBy: sure
* @remark:
*/
@Slf4j
public class MoreThanZeroValidator implements ConstraintValidator<MoreThanZero, BigDecimal> {
/**
* 初始化
* @param constraintAnnotation 非零判断的注解
*/
@Override
public void initialize(MoreThanZero constraintAnnotation) {
}
/**
* 参数校验
* @param bigDecimal 注解的参数
* @param constraintValidatorContext
* @return
*/
@Override
public boolean isValid(BigDecimal bigDecimal, ConstraintValidatorContext constraintValidatorContext) {
return bigDecimal.compareTo(BigDecimal.ZERO) > 0;
}
}
3.在需要校验的字段上加上该注解,自定义的message是需要引入hibrnate的依赖的
javax.validation
validation-api
1.1.0.Final
org.hibernate
hibernate-validator
5.2.0.Final
下面是用到的一些工具注解的说明:
我这个注解属于参数注解,其余还有类注解方法注解等等,其中:
@Target 指明该类型的注解可以注解的程序元素的范围,
Target主要的参数类型包括以下几种:
ElementType.TYPE 用于类,接口,枚举但不能是注解
ElementType.FIELD 作用于字段,包含枚举值
ElementType.METHOD 作用于方法,不包含构造方法
ElementType.PARAMETER 作用于方法的参数
ElementType.CONSTRUCTOR 作用于构造方法
ElementType.LOCAL_VERIABLE 作用于本地变量或者catch语句
ElementType.ANNOTATION_TYPE 作用于注解
ElementType.PACKAGE 作用于包
另外,类里面用到的其它注解解释如下:
@Documented
指明拥有这个注解的元素可以被javadoc此类的工具文档化。这种类型应该用于注解那些影响客户使用带注释的元素声明的类型。如果一种声明使用Documented进行注解,这种类型的注解被作为被标注的程序成员的公共API 。
@Inherited
指明该注解类型被自动继承。如果用户在当前类中查询这个元注解类型并且当前类的声明中不包含这个元注解类型,那么也将自动查询当前类的父类是否存在Inherited元注解,这个动作将被重复执行知道这个标注类型被找到,或者是查询到顶层的父类。
@Retention
指明在什么级别显示此注解
Retention主要的参数类型包括以下几种:
RetentionPolicy.SOURCE 注解存在于源代码中,编译时会被抛弃
RetentionPolicy.CLASS 注解会被编译到class文件中,但是JVM会忽略
RetentionPolicy.RUNTIME JVM会读取注解,同时会保存到class文件中,推荐使用
@Constraint
后面跟自己创建的校验逻辑处理类