Spring Validation 校验

Spring Validation 校验,第1张

概述概述 在 Web 应用中,客户端提交数据之前都会进行数据的校验,比如用户注册时填写的邮箱地址是否符合规范、用户名长度的限制等等,不过这并不意味着服务端的代码可以免去数据验证的工作,用户也可能使用 HT 概述

在 Web 应用中,客户端提交数据之前都会进行数据的校验,比如用户注册时填写的邮箱地址是否符合规范、用户名长度的限制等等,不过这并不意味着服务端的代码可以免去数据验证的工作,用户也可能使用 http 工具直接发送违法数据。为了保证数据的安全性,服务端的数据校验是必须的。

先理清概念:

JsR-303 是 JavaEE 6 中的一项子规范,又称作 Bean ValIDation,提供了针对 Java Bean 字段的一些校验注解,如@NotNull@Min等。JsR-349 是其升级版本,添加了一些新特性。Hibernate ValIDator 是对这个规范的实现(与 ORM 框架无关),并在它的基础上增加了一些新的校验注解。Spring 本身也有一个校验接口ValIDator,位于 org.springframework.valIDation 包下,但是使用这个接口需要进行硬编码,也就是手动校验,没有提供注解进行简化。为了给开发者提供便捷,Spring 也全面支持 JsR-303、JsR-349 规范,对 Hibernate ValIDation 进行二次封装,在 SpringMVC 模块中添加了自动校验机制,可以利用注解对 Java Bean 的字段的值进行校验,并将校验信息封装进特定的类中。

下面将介绍如何在 Spring 应用中使用 JsR-303 校验规范。

校验注解1. JsR-303 包含的注解
注解名称说明
@Null被注解元素必须为 null
@NonNull被注解元素必须不为 null
@AssertTrue被注解元素必须为 true
@AssertFalse被注解元素必须为 false
@Min(value)被注解元素必须是一个值,并且不能小于指定的值
@Max(value)被注解元素必须是一个值,并且不能大于指定的值
@DecimalMin(value)被注解元素必须是一个数字,并且不能小于指定的值
@DecimalMax(value)被注解元素必须是一个数字,并且不能大于指定的值
@Size(max=,min=)被注解元素的大小必须在指定范围内
@Digits(integer,fraction)被注解元素必须是一个数字,其值必须在指定范围内
@Past被注解元素必须是一个过去的日期
@Future被注解元素必须是一个将来的日期
@Pattern(regex=,flag=)被注解元素必须符合指定的正则表达式
2. Hibernate ValIDator 扩展的注解
注解名称说明
@NotBlank(message=)被注解的字符串必须非 null 且trim()后长度大于 0
@Email被注解元素必须是电子邮箱地址
@Length(min=,max=)被注解的字符串的长度必须在指定范围内
@NotEmpty被注解元素(字符串、数组、集合等)必须非 null 且长度大于 0
@Range(min=,max=,message=)被注解元素必须在合适的范围内
@URL被注解元素必须是合法的 URL
用法1. 依赖

pom.xml中引入 Hibernate ValIDator 需要的依赖包:

<dependency>    groupID>org.hibernate</artifactID>hibernate-valIDatorversion>6.0.10.Final>>

 

如果你使用的是 SpringBoot,那么只需引入spring-boot-starter-web即可,它的子依赖中包含了hibernate-valIDator和必要的数据绑定组件。

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}

 

每一个注解都包含了message字段,用于校验失败时作为提示信息。

3. 处理器方法

在处理器方法需要校验的参数上添加@ValID注解,就可以“激活”对它的校验 *** 作,后面传入一个 BindingResult 类型的参数,用于获取校验失败情况下的反馈信息。

@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();}

 

@ValID注解的参数和 BindingResult 参数必须是成对出现的,并且一前一后。

发送数据,进入上面的处理器:

控制台输出:

自定义校验

假如现在有一个需求是学生名字的内部不能含有空格,我们要如何自定义一个满足该要求的校验呢?

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();    }}

 

@Constraint指定这个注解真正的校验者类。

2. 校验者类

实现ConstraintValIDator接口:

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;    }}

 

第一个泛型参数是表明校验的注解类型,第二个泛型参数是需要被校验的类型。

initialize:初始化事件方法isValID:判断是否合法的方法

ConstraintValIDatorContext这个上下文包含了校验中所有的信息,我们可以利用这个对象进行获取默认错误提示信息,禁用错误提示信息,改写错误提示信息等 *** 作。

4. 使用
@NotContainSpaceprivate String name;

 

发送数据:

控制台输出:

可以看到NotContainSpaceValIDator的执行是先于处理器方法的,并且禁用默认提示语、设置新的提示语等 *** 作都是有效的。

分组校验

如果对同一个类,在不同的使用场景下有不同的校验规则,就可以使用分组校验。比如更新一条学生记录时,要求 ID 不为 null 且大于 0:

我们上面在对方法参数添加自动校验时用的是@ValID注解,它是由 javax 提供的,其实 Spring ValIDation 校验框架还提供了@ValIDated注解。在检验 Controller 的入参是否符合规范时,它们的基本验证功能并没有多大区别。但是,现在要进行分组校验,就必须使用@ValIDated:

@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();}

 

不过注意,在@ValIDated中指定了分组,那么其他未分组的校验将会被忽略。

关于更多 @ValID 和 @ValIDated 的区别,可见文末参考链接。

END

 

 

参考文章:https://www.cnblogs.com/zzzt20/p/12482979.html

总结

以上是内存溢出为你收集整理的Spring Validation 校验全部内容,希望文章能够帮你解决Spring Validation 校验所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1223518.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存