使用场景:
大部分实践场景,我们的注解已经很丰富,往往自定义注解用于校验对象或者是数组结构
例如:
- 校验校验人物名称是否非法;
- 校验数组中对象数据是否有空元素
- ...
前置配置:
<!-- 导入 -->
<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 [你不可以喜欢这个动物哟!]] ]
总结:
校验方式多种多样 仅供参考!
文章介绍了如何在SpringBoot应用中利用HibernateValidator进行数据校验,包括自定义注解来验证对象和数组结构。示例展示了如何创建一个自定义注解`@MyVerifyAnnotation`来校验用户选择的动物园列表中是否存在不允许的动物(如“乌鸦”),并给出了异常处理的示例。
301

被折叠的 条评论
为什么被折叠?



