4月更文d26n26- java中利用自定义注解实现参数校验

118 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第26天,点击查看活动详情

java中利用自定义注解实现参数校验

前文

本文内容主要是利用自定义注解完成对于参数的校验。正常来说系统框架层一般提供了一些参数校验的方案,但是在某些情况下会显得不够全面。例如参数的重复存在等等涉及具体业务逻辑的校验,也就无法直接通过框架中自带的共有校验完成,因此也就产生了目前的自定义注解校验方式。

如何实现自定义注解校验

自定义注解的校验主要有三部分组成:其一为在需要进行参数校验的位置,需要引入我们提前写好的校验注解;其二则是我们需要自定义一个注解,作为参数校验的内容;其三则为具体的校验逻辑类。

首先看一下我们需要自定义的校验注解:

@Documented
@ResponseBody
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,ElementType.TYPE})
@Constraint(validatedBy = TestValidatorLogic.class)
public @interface TestValidator {
    String message() default "已存在";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}

由于我们的注解需要嵌入到系统的校验中,因此我们注解中一般要指定注解生效的分组,这样可以对于注解做到实际的拆分效果。而一般我们也需要手动进行异常提示信息的指定,使其满足我们的业务逻辑。

再来看一下实际的验证逻辑,我们需要在自定义的注解之中进行实际校验逻辑的指定。

public class TestValidatorLogic implements ConstraintValidator<TestValidator,Object> {
    @Override
    public void initialize(TestValidator constraintAnnotation) {

    }

    @Override
    public boolean isValid(Object value, ConstraintValidatorContext context) {
        return !"blockUser".equals(((TestInterfaceValidator)value).getName());
    }
}

对于校验逻辑而言,需要对于框架自带的校验类进行实现。两个方法分别表示在我们的初始化阶段的操作以及实际校验的逻辑。当校验结果为true时,则表示校验通过,反之,则表示校验失败,会抛出异常返回给前端我们的校验失败信息,也就是我们在注解自定义时指定的信息字段。

最后再来看一下实际如何来使用这个注解。

@TestValidator(message = "用户已被屏蔽",groups = {Update.class})

如上表示我们引入了该注解,并指定了当校验失败时的提示信息。

经过上面三者的配合,也就能够实现自定义注解对于参数的校验:

image.png

后记

  • 千古兴亡多少事?悠悠。不尽长江滚滚流。