返回顶部
首页 > 资讯 > 后端开发 > Python >SpringBoot参数校验的最佳实战教程
  • 582
分享到

SpringBoot参数校验的最佳实战教程

2024-04-02 19:04:59 582人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录前言hibernate-validator基本使用 引入依赖 编写需要验证对象 验证对象属性是否符合要求 验证规则 空/非空验证bool时间数学 字符串模板正则 SpringBo

前言

我们这里使用hibernate-validator作为对象参数验证器,所以在正式介绍springBoot参数验证之前,需要先简单了解一下hibernate-validator的使用。

hibernate-validator基本使用

引入依赖


<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>6.0.17.Final</version>
</dependency>
<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
</dependency>

编写需要验证对象

验证要求 person对象的用户名不能为空,年龄在1-150岁之间。


@Data
public class Person {

    @NotBlank(message = "username must not be null")
    private String username;

    @Min(value = 1, message = "age must be >= 1")
    @Max(value = 150, message = "age must be < 150")
    private Integer age;
}

验证对象属性是否符合要求


    
    public Validator validator() {
        ValidatorFactory validatorFactory =
                Validation
                        .byProvider(HibernateValidator.class)
                        .configure()
                        // 验证属性时,如果有一个验证不通过就返回,不需要验证所有属性
                        .addProperty("hibernate.validator.fail_fast", "true")
                        .buildValidatorFactory();
        return validatorFactory.getValidator();
    }

    @Test
    public void test() throws Exception {
        Person person = new Person();
        Set<ConstraintViolation<Person>> validate = validator().validate(person);
        validate.forEach(errorParam -> {
            System.out.println(errorParam.getMessage());
        });
    }
  1. 我们只需要验证的对象实例即可完成对象验证,如果验证成功,那么返回一个空的集合,如果验证失败,会返回具体的验证失败的属性信息。
  2. 我们输出验证失败的错误信息如下:

username must not be null

验证规则

validator提供了大量的验证注解供我们使用,主要以下几类:

空/非空验证

  1. @Null 元素必须为空
  2. @NotNull 元素不能为空,空字符串""是非空

以下所有验证规则都在元素非空的时候才会进行验证,如果传入的元素为空,验证都会通过。

bool

  1. @AssertTrue 元素必须为true
  2. @AssertFalse 元素必须为false

时间

  1. @Future 元素必须是未来的某个时间。
  2. @FutureOrPresent 元素必须是未来或者现在的某个时间。
  3. @Past 元素必须是过去的某个时间。
  4. @PastOrPresent 元素必须是过去或者现在的某个时间。

数学

数字类型可以是BigDecimal、BigInteger、CharSequence 、byte 、 short 、 int 、 long以及它们各自的包装器类型

  1. @Digits 元素必须是该数字类型下可以被接受的数值范围内。
  2. @Negative 元素必须是负数
  3. @NegativeOrZero  元素必须小于等于0
  4. @Positive 元素必须大于0
  5. @PositiveOrZero 元素必须大于等于0
  6. @Max,@Min 元素的大小必须符合指定大小

字符串

  1. @Email 邮箱格式验证
  2. @NotBlack 验证字符串非空,空字符串""也属于空
  3. @Pattern 字符串正则验证

模板正则

validator提供了字符串模板正则的注解,这里提供一份常用的正则表达式,大家可以直接作为常量工具类放到项目里使用


public interface ValidatorPattern {

    
    String REGEX_USERNAME = "^[a-zA-Z]\w{5,17}$";

    
    String REGEX_PASSWord = "^(?=.*[a-zA-Z])(?=.*[0-9])[A-Za-z0-9._~!@#$^&*]{6,12}$";

    
    String REGEX_MOBILE = "^[1][34578]\d{9}$";

    
    String REGEX_EMAIL = "^.+@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\.)+[a-zA-Z]{2,}$";

    
    String REGEX_CHINESE = "^[\u4e00-\u9fa5],*$";

    
    String REGEX_ID_CARD = "(^\d{18}$)|(^\d{15}$)";

    
    String REGEX_URL = "Http(s)?://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?";

    
    String REGEX_IP_ADDR = "(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)";

    
    String LICENSE_NO = "^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z][A-Z][A-Z0-9]{4,5}[A-Z0-9挂学警港澳]$";

    
    String NAME = "[\u4e00-\u9fa5\u00b7\sA-Za-z]{1,15}$";

    
    String EMOJI = "[\ud83c\udc00-\ud83c\udfff]|[\ud83D\udc00-\ud83d\udfff]|[\u2600-\u27ff]";

    
    String NUMBER = "^[0-9]*$";

    
    String N_NUMS = "^\d{n}$";

}

SpringBoot整合hibernate-validator

引入依赖

这个不再赘述,直接拷贝上文的依赖信息

配置hibernate-validator验证器对象

在配置类中加入hibernate-validator验证器对象


    @Bean
    @Primary
    public Validator validator() {
        ValidatorFactory validatorFactory =
                Validation
                        .byProvider(HibernateValidator.class)
                        .configure()
                        .addProperty("hibernate.validator.fail_fast", "true")
                        .buildValidatorFactory();
        return validatorFactory.getValidator();
    }

借助Springmvc统一异常处理处理参数校验结果

配置好后,Spring会自动帮助我们进行参数验证,如果参数验证不通过,会抛出BindException异常,我们刚刚手动验证时的Set<ConstraintViolation<Person>>通过该异常获取。

我们这可以通过借助SpringMVC统一异常处理的能力处理这个异常


@Slf4j
@RestControllerAdvice
public class BaseExceptionHandler {
    
    @ResponseStatus(org.springframework.http.httpstatus.PAYMENT_REQUIRED)
    @ExceptionHandler(BindException.class)
    public R<Void> handler(BindException e) {
        String defaultMsg = e.getBindingResult().getAllErrors()
                .stream()
                .map(ObjectError::getDefaultMessage)
                .collect(Collectors.joining(":"));
        log.warn(defaultMsg);
        return R.of(IRespCode.PARAMETERS_ANOMALIES.getCode(), e.getMessage());
    }
}

使用参数校验

我们只需要在校验参数的方法传参上标注@Valid或者@Validated都行


    @PostMapping("reGISter")
    public R<Void> register(@Valid @RequestBody Person person) {
        // todo 
        return R.ok();
    }

分组校验

那么@Valid和@Validated有什么区别呢?

Validated比Valid多了一个属性,这个属性用于分组校验使用


public @interface Valid {
}
public @interface Validated {
    Class<?>[] value() default {};
}

啥叫分组校验?

就是一个实体类中的属性,在不同的方法传参中,方法的对属性的要求不同。

比如说,Person类中有三个属性,一个是用户名称,一个是邮箱,一个是年龄。

在注册用户接口中,用户名称,邮箱和年龄都不能为空,但是在更改用户的信息接口中,用户的年龄和邮箱都可以为空,但是用户名称不能为空。

这时候,我们就可以按照对属性校验的要求进行分组。

新建一个RegisterGroup分组,该分组只是一个空的接口,仅仅用于标记该校验要求


public interface RegisterGroup {
}

对校验要求进行分组


@Data
public class Person {

    @NotBlank(message = "username must not be null")
    private String username;

    @Min(value = 1, message = "age must be >= 1")
    @Max(value = 150, message = "age must be < 150")
    @NotNull(message = "age must not be null", groups = RegisterGroup.class)
    private Integer age;

    @Email(message = "email fORMat error")
    @NotBlank(message = "email must not be null",groups = RegisterGroup.class)
    private String email;
}

方法调用时,加入分组要求


    @PostMapping("register")
    public R<Void> register(@Validated(value = RegisterGroup.class) @RequestBody Person person) {
        // todo
        return R.ok();
    }

这种方式其实不推荐使用,我在标题的时候,也已经标记为“过时”,因为,我们完全可以为这两个不同的接口创建两个不同的实体类,而不是使用分组对校验要求进行隔离,因为实际生产环境中,分组可能有非常多个,这会为我们的程序的可读性埋下隐患,后期开发人员难以维护,而且对于自动生成API文档也不友好。大家对于分组只需要了解即可,不建议在项目开发中使用。

总结

到此这篇关于SpringBoot参数校验的文章就介绍到这了,更多相关SpringBoot参数校验内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: SpringBoot参数校验的最佳实战教程

本文链接: https://lsjlt.com/news/133512.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • SpringBoot参数校验的最佳实战教程
    目录前言hibernate-validator基本使用 引入依赖 编写需要验证对象 验证对象属性是否符合要求 验证规则 空/非空验证bool时间数学 字符串模板正则 SpringBo...
    99+
    2024-04-02
  • SpringBoot各种参数校验的实例教程
    目录 简单使用引入依赖requestBody参数校验requestParam/PathVariable参数校验统一异常处理进阶使用分组校验嵌套校验集合校验自定义校验编程式校...
    99+
    2024-04-02
  • java开发SpringBoot参数校验过程示例教程
    目录为什么需要参数校验SpringBoot中集成参数校验第一步,引入依赖第二步,定义要参数校验的实体类常见的约束注解如下:第三步,定义校验类进行测试第四步,体验效果自定义参数校验第一...
    99+
    2024-04-02
  • springboot接口参数校验JSR303的实现
    目录一、在controller接口处理校验异常二、统一异常处理三、错误码枚举类四、自定义参数校验注解在 javax.validation.constraints包中定义了非常多的校验...
    99+
    2022-11-13
    springboot接口参数校验JSR303 springboot JSR303
  • Spring Boot参数校验及分组校验的使用教程
    目录一  前言1  什么是validator二  注解介绍1  validator内置注解三  使用1  单参数校验2&n...
    99+
    2024-04-02
  • Spring Boot项目传参校验的最佳实践指南
    目录场景还原神注解加持数据异常统一拦截总结场景还原 简单业务场景模拟: 假如你现在在做一个成绩录入系统,你愉快地用Spring Boot框架写了一个后台接口,用于接收前台浏览器传过来...
    99+
    2024-04-02
  • SpringMVC使用hibernate-validator进行参数校验最佳实践记录
    在我们用Controller接收参数后,往往需要对参数进行校验。如果我们手写校验的话,就会有一堆的判空代码,看起来很不优雅,写起来也费时费力。下面来看下通过hibernate-val...
    99+
    2024-04-02
  • 怎么实现java开发SpringBoot参数校验过程
    这篇文章主要讲解了“怎么实现java开发SpringBoot参数校验过程”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么实现java开发SpringBoot参数校验过程”吧!为什么需要参数...
    99+
    2023-06-25
  • SpringBoot参数校验的方法总结
    目录一、前言二、注解介绍三、添加依赖四、创建用于校验的实体类五、写一个测试用的接口六、在实体类中添加注解七、在 controller 方法中添加 Validated 注解八、添加全局...
    99+
    2024-04-02
  • SpringBoot利用validation实现优雅的校验参数
    目录1、前言2、常用校验3、spring boot的数据自动校验功能3.1 引入依赖3.2 构建启动类3.3 创建需要被校验的实体类3.4 在Controller中校验数据3.5 统...
    99+
    2024-04-02
  • 超详细讲解SpringBoot参数校验实例
    目录使用传统方式的弊端引入依赖注解说明一、对实体类进行校验1、entity2、controller3、编写全局统一异常处理二、针对单个参数进行校验三、分组校验1、entity2、co...
    99+
    2024-04-02
  • SpringBoot中怎么实现请求参数校验
    在Spring Boot中,可以使用JSR 303规范中的注解来实现请求参数的校验。具体步骤如下: 在Controller类中的请...
    99+
    2024-03-08
    SpringBoot
  • SpringBoot后端数据校验实战操作指南
    目录1.为什么后端要进行数据校验?2.怎么使用数据校验?(要添加对应依赖)(1)在实体上的属性上添加校验注解:(2)在controller层的方法前加上注解@Validated开启数...
    99+
    2024-04-02
  • SpringBoot使用validation做参数校验的实现步骤
    1.添加依赖 直接添加 hibernate-validator <dependency> <groupId>org.hibern...
    99+
    2024-04-02
  • SpringBoot如何进行参数校验实例详解
    目录前言为什么需要参数校验SpringBoot中集成参数校验第一步,引入依赖第二步,定义要参数校验的实体类第三步,定义校验类进行测试第四步,体验效果参数异常加入全局异常处理器体验效果...
    99+
    2024-04-02
  • SpringBoot实现接口的各种参数校验的示例
    目录1.添加依赖2.接口参数校验2.1 requestBody参数校验2.2 requestParam/PathVariable参数校验3.统一异常处理4.进阶使用4.1 分组校验4...
    99+
    2024-04-02
  • SpringBoot进行参数校验的方法详解
    目录介绍1.SpringBoot中集成参数校验1.1引入依赖1.2定义参数实体类1.3定义校验类进行测试1.4打开接口文档模拟提交数据2.参数异常加入全局异常处理器3.自定义参数校验...
    99+
    2024-04-02
  • SpringBoot中参数校验的方法有哪些
    这篇文章给大家分享的是有关SpringBoot中参数校验的方法有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、前言在 Web 开发中经常需要对前端传过来的参数进行校验,例如格式校验、非空校验等,基本上每个...
    99+
    2023-06-15
  • SpringBoot参数校验之@Valid的使用详解
    目录简介依赖代码 测试测试1:缺少字段测试2:不缺少字段测试3:缺少字段,后端获取BindResult 简介 说明 本文用示例说明SpringBoot的@Vali...
    99+
    2024-04-02
  • SpringBoot参数校验之@Validated的使用详解
    目录简介依赖用法1:不分组代码测试用法2:分组代码测试简介 说明 本文用示例说明SpringBoot的@Validated的用法。 依赖 <dependency> ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作