自定义注解--实现参数校验

学习内容:

自定义注解,校验传入数据是否为“asc”或“desc”


学习心得:

1.自定义注解的基本步骤:

  1. 在项目中新建一个包annotation,用于以后存放自定义的注解。
  2. annotation包中新建一个注解类,根据注解的功能命名,命名需要遵循大驼峰法则。
  3. 在注解类的类名上方,添加注解
    @Target(用于说明注解可以应用的范围,比如类、类的属性、方法、方法参数等)
    @Retention(用于说明注解起作用的时间,比如在源代码中、在编译时、在运行时)
    @Constraint实现注解的功能时需要用,主要将注解的实现类作为参数传入该注解。【注解的实现也可以在注解类中实现,无需单独建类,但是为了让代码结构更加清晰,我个人认为,应当重新建类,作为注解的实现类】
    4.在实现类中,首先实现ConstraintValidator接口,其中第一个参数是自定义的注解类,第二个参数是要校验的参数的数据类型;其次是要重写isValid方法,该方法第一个参数即为加了注解的那个参数,所以无需想办法获取需要被校验的值【我在这里饶了很大的弯子,查了很多的资料,本来以为是要使用反射,先获取到类,再依次获取到某个字段的值,但实际上,应该不需要这样做,即使需求很复杂,也不需要通过反射获取被校验的值,因为isVaild方法的第一个参数已经可以实现获得被校验参数值的需求了】
    5.对于简单的需求,无需重写ConstraintValidator中的initialize方法。如果需求较为复杂,需要在使用注解时传入一些参数,比如像实现功能判断输入值属于一个范围,那就需要从注解中获取另外的参数,进而需要在initialize方法中,对这些参数值进行获取,并且需要在实现类中定义私有属性,来分别保存这些值。因为这些值,在校验逻辑中需要使用。

2.自定义注解的意义:
对后端来说,有些功能比较重复,将这些重复的工作,交给注解,可以加快开发速度,也可以减少代码量,让代码更加简洁。

3.此次不完美的地方
这次实现的注解,单纯可以判断输入字符是否是asc或者 desc。应当实现一个更为复杂的注解,可以判断输入的字符串,让使用该注解的程序员,输入任意字符数组,判断被校验值是否存在于该数组。
实现思路:在注解类中新添加成员变量,接受用户输入的任意字符串数组,循环遍历该数组,判断被校验字符串是否属于用户感兴趣的数组

4.注解的其他实现方式
对于一些逻辑,不需要在实现类中实现,可以在注解类中,利用已有的注解实现,比如实现对手机号码的校验,我们可以用@Pattern注解对输入的值进行正则匹配,以及我们可以使用@NotNull来对传入值进行非空校验

你可能感兴趣的:(java)