java自定义校验注解

随着业务的日趋复杂。我们对客户端传来的参数校验也越来越多。这么多的校验如果都写在业务逻辑中,业务代码看起来会很乱。
找时间学习了一下java的注解。特在此记录一下学习过程。
说明:这种自定义注解只能应用于java bean的校验。不能校验基本类型
java的注解是在jdk1.5引进的一项技术。注解的关键字是@Interface
如果自定义一个注解呢?
使用Idea进行创建
java自定义校验注解_第1张图片
选择Annotation类型
java自定义校验注解_第2张图片
这样我们就成功创建了一个注解。

刚创建出来的注解是不能使用的。因为我们不知道注解应该加在什么地方,在什么时间生效,所以就引出来元注解的概念。元注解就是注解的注解(有点绕口令的感觉)。专门用来注解注解类型。
java的元注解一共有4个,分别是:
@Target,@Retention,@Documented,@Inherited
@Target直接指明了该注解生效的位置,该参数没有default值,必填。参数是一个枚举类型
java自定义校验注解_第3张图片
@Retention指明了注解生效的阶段
java自定义校验注解_第4张图片
@Documented
当我们用javaDoc生成API文档时,是否将该注解记录到API文档中。
@Inherited
这个注解是说,我们的注解是否需要被子类继承。是发生在子类和父类之间的一种注解。
当我们的注解作用域是Element.TYPE时,我们定义在类上的注解可以被子类继承。但是如果我们注解的作用域是Element.METHOD时,并且父类的该方法被子类重写,那作用在父类的注解不会被子类继承。所以如果我们在接口的方法中定义的注解,永远不会被实现类继承,因为实现类一定会重写接口中的方法。

以上就是元注解的解释。

解释完了,让我们继续注解类型的代码编写
java自定义校验注解_第5张图片
如图是我们自定义的一个年龄注解,message是该注解校验失败时的提示信息,default是默认值,我们可以重写该提示信息。下面两行代码是自定义注解需要加上的,这里不作研究。

注解定义完了,你肯定会有一个疑问。注解何时会生效。关键点是我自定的Age注解上面有一个@Constraint注解,该注解指明了校验类,我们点进MyAnnoationValidator类看一下
java自定义校验注解_第6张图片
可以看到校验类都必须要实现ConstraintValidator接口,并且重写接口中的两个方法。
接口上是有泛型的,第一个泛型代表了我们这个校验类是哪个注解的校验类,第二个泛型代表该注解校验的参数是什么类型,第二个注解默认是Object类型,我们改成了Integer类型,
initialize方法是该校验类的初始化方法,在这个方法里,我们可以对传进来的参数作一些处理。
isValid方法就是注解类型的核心校验方法,校验通过与否就是看该方法的返回值是true还是false,true就代表校验通过,false就代表校验失败

下面写一个测试类,校验一下我们自定义的这个注解

定义一个实体类User
在这里插入图片描述
定义一个Controller
java自定义校验注解_第7张图片
使用@Valid注解我们的User类,@Valid注解没有实际的注解体,这个注解的作用就是使我们的@Age注解起作用。
后面的BindingResult类的作用是当注解校验失败时,我们可以手动去处理。如果不加这个类的话,注解校验失败,会直接返回http的400错误码。加上这个类,我们可以自己自定义错误信息,然后返回,此时的http状态码为200

扩展一下:
如果我们想将自定义注解加在方法签名中,如下:
java自定义校验注解_第8张图片
这种情况,我们可以引入hibrnate的校验
添加依赖:


    
      javax.validation
      validation-api
      1.1.0.Final
    
    
    
      org.hibernate
      hibernate-validator
      5.2.0.Final
    

然后在类上添加@Validated注解,如下:
java自定义校验注解_第9张图片
然后在方法的入参上添加我们的自定义注解就可以了

你可能感兴趣的:(@Constraint,java注解)