Java 自定义验证注解

文章介绍了如何在SpringBoot应用中利用HibernateValidator进行数据校验,包括自定义注解来验证对象和数组结构。示例展示了如何创建一个自定义注解`@MyVerifyAnnotation`来校验用户选择的动物园列表中是否存在不允许的动物(如“乌鸦”),并给出了异常处理的示例。
摘要由CSDN通过智能技术生成

使用场景:

大部分实践场景,我们的注解已经很丰富,往往自定义注解用于校验对象或者是数组结构

例如:

  • 校验校验人物名称是否非法;
  • 校验数组中对象数据是否有空元素
  • ... 

前置配置:

<!-- 导入  -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
    <version>3.1.0</version>
</dependency>

<!-- 关键注解 -->
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>6.0.1.Final</version>
</dependency>


<!-- 以上导入其一即可,其实他两是依赖关系,可以自己看树结构 -->

开始使用:

// 用户实体
@Data
@ToString
public class User {


    @NotBlank(message = "名字咋能为空!")
    private String name;

    @MyVerifyAnnotation(invalid = "乌鸦")
    private List<IZoo> zoos;

    @Data
    public static class IZoo {

        private String zooName;
    }
}
@Documented
@Constraint(validatedBy = {MyVerifyAnnotation.IVerify.class})
@Target({ElementType.ANNOTATION_TYPE, ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyVerifyAnnotation   {

    String message() default "你不可以喜欢这个动物哟!";

    String invalid() default "";

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

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

    class IVerify implements javax.validation.ConstraintValidator<MyVerifyAnnotation, List<User.IZoo>> {

        // 不被允许喜欢的zoo 名称
        private String zooName;

        @Override
        public void initialize(MyVerifyAnnotation constraintAnnotation) {
            ConstraintValidator.super.initialize(constraintAnnotation);
            zooName = constraintAnnotation.invalid();
        }

        @Override
        public boolean isValid(List<User.IZoo> list, ConstraintValidatorContext constraintValidatorContext) {
            return !(list.stream().filter(z -> Objects.equals(zooName, z.getZooName())).count() > 0);
        }
    }
}

 测试:添加用户时,校验其中选择的动物是否包含“乌鸦”

@RestController
@RequestMapping("/user")
public class UserController {

    @PostMapping("/add")
    @ResponseBody
    @ApiOperation(value = "添加用户", tags = "添加用户")
    public String addUser(@RequestBody @Valid User user) {
        System.out.println(user);
        return "";
    }
}
Resolved [org.springframework.web.bind.MethodArgumentNotValidException: Validation failed for argument [0] in public java.lang.String com.example.springserver01.controller.UserController.addUser(com.example.springserver01.entry.User): [Field error in object 'user' on field 'zoos': rejected value [[User.IZoo(zooName=乌鸦), User.IZoo(zooName=熊猫)]]; codes [MyVerifyAnnotation.user.zoos,MyVerifyAnnotation.zoos,MyVerifyAnnotation.java.util.List,MyVerifyAnnotation]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [user.zoos,zoos]; arguments []; default message [zoos],乌鸦]; default message [你不可以喜欢这个动物哟!]] ]

 


总结:

校验方式多种多样 仅供参考!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值