Spring Validation 校验
概述在 Web 应用中,客户端提交数据之前都会进行数据的校验,比如用户注册时填写的邮箱地址是否符合规范、用户名长度的限制等等,不过这并不意味着服务端的代码可以免去数据验证的工作,用户也可能使用 HTTP 工具直接发送违法数据。为了保证数据的安全性,服务端的数据校验是必须的。 先理清概念:
下面将介绍如何在 Spring 应用中使用 JSR-303 校验规范。 校验注解1. JSR-303 包含的注解
2. Hibernate Validator 扩展的注解
用法1. 依赖在 <dependency> groupId>org.hibernate</artifactId>hibernate-validatorversion>6.0.10.Final> > ? 如果你使用的是 SpringBoot,那么只需引入 2. 实体类public class Student { private Long id; @NotBlank(message = "名称不能为空") String name; @Range(min = 10,max = 25,message = "年龄必须在10~25之间 ") Integer age; @Pattern(regexp = "^1(3|4|5|7|8)d{9}$",message = "手机号码格式错误") @NotBlank(message = "手机号码不能为空" String phone; @Email(message = "邮箱格式错误" String email; // Getter/Setter } ? 每一个注解都包含了 3. 处理器方法在处理器方法需要校验的参数上添加 @PostMapping("/student") public ApiResult addStudent(@RequestBody @Valid Student student,BindingResult result) { if (result.hasErrors()) { for (ObjectError error : result.getAllErrors()) { System.out.println(error.getDefaultMessage(); } return ApiResult.error(); } studentService.insert(student); ApiResult.success(); } ?
发送数据,进入上面的处理器: 控制台输出: 自定义校验假如现在有一个需求是学生名字的内部不能含有空格,我们要如何自定义一个满足该要求的校验呢? 1. 自定义注解@Target({FIELD,METHOD,PARAMETER}) @Retention(RUNTIME) @Constraint(validatedBy = NotContainSpaceValidator.public @interface NotContainSpace { 默认错误消息 String message() default "不能包含空格"; 分组 Class<?>[] groups() default {}; 负载 Class<? extends Payload>[] payload() 指定多个时使用,从而支持重复注解 @Target({FIELD,PARAMETER}) @Retention(RetentionPolicy.RUNTIME) @Documented @ List { NotContainSpace[] value(); } } ?
2. 校验者类实现 class NotContainSpaceValidator implements ConstraintValidator<NotContainSpace,String> { @Override void initialize(NotContainSpace notContainSpace) { } @Override boolean isValid(String s,ConstraintValidatorContext context) { if (s != null && s.trim().contains(" ")) { 获取默认提示信息 String constraintMessageTemplate = context.getDefaultConstraintMessageTemplate(); System.out.println(constraintMessageTemplate); 禁用默认提示信息 context.disableDefaultConstraintViolation(); 设置提示语 context.buildConstraintViolationWithTemplate("Can not contain space").addConstraintViolation(); return false; } true; } } ? 第一个泛型参数是表明校验的注解类型,第二个泛型参数是需要被校验的类型。
4. 使用@NotContainSpace private String name; ? 发送数据: 控制台输出: 可以看到 分组校验如果对同一个类,在不同的使用场景下有不同的校验规则,就可以使用分组校验。比如更新一条学生记录时,要求 id 不为 null 且大于 0: 我们上面在对方法参数添加自动校验时用的是 @PutMapping("/student"public ApiResult updateStudent(@RequestBody @Validated({Student.Update.}) Student student,1)"> (ObjectError error : result.getAllErrors()) { do stuff } ApiResult.error(); } studentService.update(student); ApiResult.success(); } ? 不过注意,在 关于更多 @Valid 和 @Validated 的区别,可见文末参考链接。 END ? ? 参考文章:https://www.cnblogs.com/zzzt20/p/12482979.html (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |