java自定义校验注解

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

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

以上就是元注解的解释。

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

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

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

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

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

<!--jsr 303-->
    <dependency>
      <groupId>javax.validation</groupId>
      <artifactId>validation-api</artifactId>
      <version>1.1.0.Final</version>
    </dependency>
    <!-- hibernate validator-->
    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-validator</artifactId>
      <version>5.2.0.Final</version>
    </dependency>

然后在类上添加@Validated注解,如下:
在这里插入图片描述
然后在方法的入参上添加我们的自定义注解就可以了

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值