【SpringBoot】SpringBoot集成hibernate-validator

为什么用hibernate-validator

原先项目中,对前端传入的参数进行校验代码非常多,而且重复的代码很多,在多人开发环境中,很多人返回的值也是五花八门,没有固定格式。

引入hibernate-validator后,能通过注解方式解决校验代码过多和重复的问题,返回格式由他统一负责,内容可以*编辑。

怎么用

  1. POM引入包,在springboot中,已经集成了这个工具,所以只要声明一下即可

            <dependency>
                <groupId>org.hibernate.validator</groupId>
                <artifactId>hibernate-validator</artifactId>
            </dependency>
    
  2. 在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;
    
    }
    
  3. 在controller中,参数前面,加上@Validated 注解,否则不生效。

    @RestController
    @RequestMapping(value ="/hibernate")
    public class HibernateValidatorController {
        @PostMapping(value ="/test1")
        @ResponseBody
        public ValidationTestVo testValidation(@Validated @RequestBody ValidationTestVo validationTestVo){
            return validationTestVo;
        }
    }
    
  4. 请求触发

    {
        "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

上一篇:Db4o数据库-其它存储


下一篇:常见面试题200+