为什么用hibernate-validator
原先项目中,对前端传入的参数进行校验代码非常多,而且重复的代码很多,在多人开发环境中,很多人返回的值也是五花八门,没有固定格式。
引入hibernate-validator后,能通过注解方式解决校验代码过多和重复的问题,返回格式由他统一负责,内容可以自由编辑。
怎么用
-
POM引入包,在springboot中,已经集成了这个工具,所以只要声明一下即可
<dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> </dependency>
-
在RequestVo中,加上需要的注解
@Data @ToString public class ValidationTestVo implements Serializable { @NotNull(message ="【用户ID】不能为空" ) @Size(min = 1,max = 5,message = "用户ID长度必须在1-5之间") private String userId; @Range(min = 0,max = 200,message = "年龄需要在0-200中间") @NotNull(message = "【年龄】不能为空") private int age; @Pattern(regexp = "^([\\u4e00-\\u9fa5]{1,20}|[a-zA-Z\\.\\s]{1,20})$",message = "名字只能输入中文、英文,且在20个字符以内") @NotEmpty(message = "【姓名】不能为空") private String userName; @Email(message = "【邮箱】格式不规范") private String email; @Past private Date birthday; }
-
在controller中,参数前面,加上@Validated 注解,否则不生效。
@RestController @RequestMapping(value ="/hibernate") public class HibernateValidatorController { @PostMapping(value ="/test1") @ResponseBody public ValidationTestVo testValidation(@Validated @RequestBody ValidationTestVo validationTestVo){ return validationTestVo; } }
-
请求触发
{ "userId":"122221", "age":1111, "userName":"sad32.m,.laa", "email":"12112", "birthday":1391141532000 }
由于没有做统一异常处理,所以当前返回的是这样的。
{ "timestamp": "2021-12-20T07:33:10.458+00:00", "status": 400, "error": "Bad Request", "trace": "", "message": "Validation failed for object='validationTestVo'. Error count: 4", "errors": [ { "codes": [ "Pattern.validationTestVo.userName", "Pattern.userName", "Pattern.java.lang.String", "Pattern" ], "arguments": [ { "codes": [ "validationTestVo.userName", "userName" ], "arguments": null, "defaultMessage": "userName", "code": "userName" }, [], { "arguments": null, "defaultMessage": "^([\\u4e00-\\u9fa5]{1,20}|[a-zA-Z\\.\\s]{1,20})$", "codes": [ "^([\\u4e00-\\u9fa5]{1,20}|[a-zA-Z\\.\\s]{1,20})$" ] } ], "defaultMessage": "名字只能输入中文、英文,且在20个字符以内", "objectName": "validationTestVo", "field": "userName", "rejectedValue": "sad32.m,.laa", "bindingFailure": false, "code": "Pattern" }, { "codes": [ "Size.validationTestVo.userId", "Size.userId", "Size.java.lang.String", "Size" ], "arguments": [ { "codes": [ "validationTestVo.userId", "userId" ], "arguments": null, "defaultMessage": "userId", "code": "userId" }, 5, 1 ], "defaultMessage": "用户ID长度必须在1-5之间", "objectName": "validationTestVo", "field": "userId", "rejectedValue": "122221", "bindingFailure": false, "code": "Size" }, { "codes": [ "Range.validationTestVo.age", "Range.age", "Range.int", "Range" ], "arguments": [ { "codes": [ "validationTestVo.age", "age" ], "arguments": null, "defaultMessage": "age", "code": "age" }, 200, 0 ], "defaultMessage": "年龄需要在0-200中间", "objectName": "validationTestVo", "field": "age", "rejectedValue": 1111, "bindingFailure": false, "code": "Range" }, { "codes": [ "Email.validationTestVo.email", "Email.email", "Email.java.lang.String", "Email" ], "arguments": [ { "codes": [ "validationTestVo.email", "email" ], "arguments": null, "defaultMessage": "email", "code": "email" }, [], { "arguments": null, "defaultMessage": ".*", "codes": [ ".*" ] } ], "defaultMessage": "【邮箱】格式不规范", "objectName": "validationTestVo", "field": "email", "rejectedValue": "12112", "bindingFailure": false, "code": "Email" } ], "path": "/hibernate/test1" }
都有哪些注解
@AssertFalse 限制必须为false
@AssertTrue 限制必须为true
@DecimalMax 限制必须为一个不大于指定值的数字
@DecimalMin 限制必须为一个不小于指定值的数字
@Digits 限制必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction
@Null 限制只能为null
@NotNull 限制必须不为null
@Email 验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式
@Future 限制必须是一个将来的日期
@Max 限制必须为一个不大于指定值的数字
@Min 限制必须为一个不小于指定值的数字
@NotBlank 验证注解的元素值不为null且去除空格后长度不为0,@NotBlank只用于字符串
@NotEmpty 验证注解的元素值不为null且不为空,支持字符串、集合、Map和数组类型
@Past 限制必须是一个过去的日期
@Pattern 限制必须符合指定的正则表达式
@Range 限制必须在合适的范围内
@Size 限制字符长度必须在min到max之间
@CreditCardNumber 检查带注释的字符序列是否通过了Luhn校验和测试
@Currency 检查带注释的货币单位javax.money.MonetaryAmount是否为指定货币单位的一部分
@EAN 检查带注释的字符序列是否为有效的EAN条形码。type确定条形码的类型。默认值为EAN-13
@ISBN 检查带注释的字符序列是否为有效的ISBN。type确定ISBN的类型。默认值为ISBN-13
@Length 验证该注释字符序列是间min和max包含
@Range 检查带注释的值是否在(包括)指定的最小值和最大值之间
@Length 限制必须为true
@Range 限制必须为一个不大于指定值的数字
@SafeHtml 检查带注释的值是否包含潜在的恶意片段
@UniqueElements 检查带注释的集合是否仅包含唯一元素
@URL 根据RFC2396检查带注释的字符序列是否为有效URL