引入依赖
1 | <dependency> |
相关注解
注解 | 功能 |
---|---|
@AssertFalse | 可以为null,如果不为null的话必须为false |
@AssertTrue | 可以为null,如果不为null的话必须为true |
@DecimalMax | 设置不能超过最大值 |
@DecimalMin | 设置不能超过最小值 |
@Digits | 设置必须是数字且数字整数的位数和小数的位数必须在指定范围内 |
@Future | 日期必须在当前日期的未来 |
@Past | 日期必须在当前日期的过去 |
@Max | 最大不得超过此最大值 |
@Min | 最大不得小于此最小值 |
@NotNull | 不能为null,可以是空 |
@Null | 必须为null |
@Pattern | 必须满足指定的正则表达式 |
@Size | 集合、数组、map等的size()值必须在指定范围内 |
必须是email格式 | |
@Length | 长度必须在指定范围内 |
@NotBlank | 字符串不能为null,字符串trim()后不能等于”” |
@NotEmpty | 不能为null,集合、数组、map等size()不能为0;字符串trim()后可以等于”” |
@Range | 值必须在指定范围内 |
@URL | 必须是一个URL |
校验
实体类添加校验注解
在实体类中需要校验的字段加入响应的注解
1 | public class Article { |
在controller层校验
controller层的方法添加@Valid或者@Validated注解
1 |
|
捕获校验结果
写一个全局全局捕获异常的行数,捕获表单校验异常的结果,返回给前端
1 |
|
校验分组
在实际开发中经常会遇到这种情况:想要用一个实体类去接收多个controller的参数,但是不同controller所需要的参数又有些许不同,而你又不想为这点不同去建个新的类接收参数。比如有一个create
接口不需要id
参数,而eidt
接口又需要该参数。校验插件提供的groups
来实现
定义表示组别的interface
1 | // 名字随便起 |
在实体类的注解中标记这个哪个组所使用的参数
1 | public class Article { |
在@Validated
中指定使用哪个组
/edit
接口只对标记了ArticleUpdate
的参数校验生效,即上面的id
属性
1 |
|
也可以多个分组同时用
Default
为javax.validation.groups
中的类,表示没有分组的参数,本文中对应title
,content
1 |
|
手动校验
如果要在其他地方校验,例如在 service 层校验,就不能用 controller 层添加注解的方式了。要手动触发校验,您可以使用javax.validation.Validator
接口的实现类,例如Hibernate Validator。
在Spring Boot中使用Hibernate Validator进行手动校验的步骤如下:
- 在您的项目中添加Hibernate Validator依赖:
1 | phpCopy code |
- 在需要校验的地方注入
javax.validation.Validator
实例:
1 |
|
- 在您的控制器方法中,使用
validator.validate()
方法手动触发校验。例如:
1 |
|
在这个例子中,validator.validate(request)
方法返回一个包含所有约束违反的集合,您可以对这个集合进行处理来处理校验错误。如果校验通过,集合将为空。
请注意,手动触发校验时,您还可以使用BindingResult
对象来收集校验错误。BindingResult
对象将包含校验结果,而不会抛出异常,因此您可以在代码中检查这些错误并做出响应。
改进代码
我们封装一个校验工具类
1 | package com.zdong.dream.utils; |
全局捕获异常。
1 | /** |
在需要校验的地方引入工具类
1 |
|
手动校验同样支持分组
1 |
|