返回顶部
首页 > 资讯 > 后端开发 > Python >SpringMVC使用hibernate-validator进行参数校验最佳实践记录
  • 363
分享到

SpringMVC使用hibernate-validator进行参数校验最佳实践记录

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

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

摘要

在我们用Controller接收参数后,往往需要对参数进行校验。如果我们手写校验的话,就会有一堆的判空代码,看起来很不优雅,写起来也费时费力。下面来看下通过hibernate-val

在我们用Controller接收参数后,往往需要对参数进行校验。如果我们手写校验的话,就会有一堆的判空代码,看起来很不优雅,写起来也费时费力。下面来看下通过hibernate-validator来进行优雅的参数校验。

首先需要引入依赖:


<dependency>
	<groupId>org.hibernate.validator</groupId>
	<artifactId>hibernate-validator</artifactId>
	<version>6.2.0.Final</version>
</dependency>

hibernate-validator注解

hibernate-validator提供了很多注解来让我们进行参数校验:

常用的校验注解如下表所示:

注解 说明
@Null 被注释的元素必须为null
@AssertTrue 被注释的元素必须为true
@AssertFalse 被注释的元素必须为false
@DecimalMin(value=,message=) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@DecimalMax(value=,message=) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@Digits (integer, fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内
@Past 被注释的元素必须是一个过去的日期
@Future 被注释的元素必须是一个将来的日期
@Email 被注释的元素必须是电子邮箱地址

主要区分下@NotNull、@NotEmpty、@NotBlank 3个注解的区别:
(1)@NotNull:任何对象的value不能为null。
(2)@NotEmpty:集合对象的元素不为0,即集合不为空,也可以用于字符串不为null。
(3)@NotBlank:只能用于字符串不为null,并且字符串trim()以后length要大于0。

需要注意如下几点:
(1)除了@Empty要求字符串不能全是空格,其他的字符串校验都是允许空格的。
(2)message是可以引用常量的,但是如@Size里max不允许引用对象常量,基本类型常量是可以的。message是错误提示信息,是可以返回给前台的。
(3)大部分规则校验都是允许参数为null,即当不存在这个值时,就不进行校验了。


不太常用的校验注解如下表所示:

注解 说明
@Null 被注释的元素必须为null
@AssertTrue 被注释的元素必须为true
@AssertFalse 被注释的元素必须为false
@DecimalMin(value=,message=) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@DecimalMax(value=,message=) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@Digits (integer, fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内
@Past 被注释的元素必须是一个过去的日期
@Future 被注释的元素必须是一个将来的日期
@Email 被注释的元素必须是电子邮箱地址

代码实战

1.、使用BindingResult获取检验结果

我们可以使用BindingResult获取检验结果,构造友好的返回信息

Controller中的代码如下:


@api(tags = "校验框架")
@RestController
@RequestMapping("/validate")
public class ValidatedController {
 
 
    @ApiOperation(value = "bindValidate")
    @PostMapping("bindValidate")
    public ValidatedVO bindValidate(@RequestBody @Validated(value= {ValidatedGroup.DELET.class}) ValidatedVO validatedVO, BindingResult result) {
        if (result.hasErrors()) {
            StringBuilder message = new StringBuilder("参数校验失败:");
            List<ObjectError> errors = result.getAllErrors();
            for (ObjectError error : errors) {
                message.append(error.getDefaultMessage()).append(".");
            }
            throw HttpError.error(111, message.toString());
        }
        return validatedVO;
    }
 
 
}

我们用以下实体类来作为Controller的参数接收实体


import lombok.Data;
 
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
 
@Data
public class ValidatedVO {
 
    //更新、删除时不能为空
    @NotNull(message = "id不能为空", groups = {ValidatedGroup.UPDATE.class, ValidatedGroup.DELET.class})
    private Long id;
 
    //新增、更新时不能为空
    @NotBlank(message = "name不能为空", groups = {ValidatedGroup.CREATE.class ,ValidatedGroup.UPDATE.class})
    private String name;
 
    //查询时不能为空
    @NotBlank(message = "queryParam不能为空", groups = {ValidatedGroup.QUERY.class})
    private String queryParam;
 
}

分组的类:


public class ValidatedGroup {
 
    public interface CREATE{}
 
    public interface DELET{}
 
    public interface UPDATE{}
 
    public interface QUERY{}
}

需要注意的是,@Validated支持分组校验,即校验注解中的groups属性。这个为我们的校验也提供了便利。我们可以在Controller需要校验的参数前用@Validated的value属性来表示需要校验的分组,那么就会只会校验实体对象中拥有相同的分组的属性。这样我们就可以只用一个实体满足不同的场景了。

启动项目后,我们在swagger上请求,传递空的JSON字符串【{}】,返回结果:

{
  "code": 111,
  "message": "参数校验失败:id不能为空."
}

 然而每次都需要在请求进来时用BindingResult做处理,很不优雅。

2.通过@RestControllerAdvice统一处理参数校验信息

如果我们不用BindingResult获取校验结果,即不做处理,框架就会抛出异常,响应400码,返回一些不友好的错误信息。即用如下代码:


@ApiOperation(value = "bindValidate")
    @PostMapping("bindValidate")
    public ValidatedVO bindValidate(@RequestBody @Validated(value= {ValidatedGroup.DELET.class}) ValidatedVO validatedVO) {
        
        return validatedVO;
    }

那么我们就可以使用@RestControllerAdvice来对异常进行处理,进行友好信息的提示

如果对@RestControllerAdvice和@ControllerAdvice不了解的,可以去查询学习,这里不进行讲述


@RestControllerAdvice
public class GlobalExceptionHandler {    
 
    @ExceptionHandler(Exception.class)
    public CommonErrorVO handle(Exception e){
        if (e instanceof HttpError) {
            HttpError error = (HttpError)e;
            return CommonErrorVO.builder().code(error.getCode()).message(error.getMessage()).build();
        } else if (e instanceof MethodArgumentNotValidException) {
            MethodArgumentNotValidException validException = (MethodArgumentNotValidException) e;
            StringBuilder message = new StringBuilder("");
            validException.getBindingResult().getAllErrors().forEach(err -> {
                message.append(err.getDefaultMessage()).append(".");
            });
            return CommonErrorVO.builder().code(888).message(message.toString()).build();
        } else {
            return CommonErrorVO.builder().code(999).message(e.getMessage()).build();
        }
    }    
}

MethodArgumentNotValidException异常即为hibernate-validator校验不通过抛出的异常信息,我们从其中获取到校验失败的信息来进行组装。

如上,我们通过@Validated配合@RestControllerAdvice完成了优雅的参数校验。

为了体现分组校验的便利性,我做了如下的测试,如果每个请求参数都是空的json字符串【{}】的话,那么返回的信息如下。


@Api(tags = "校验框架")
@RestController
@RequestMapping("/validate")
public class ValidatedController {
 
    
    @ApiOperation(value = "分组校验:QUERY参数校验")//返回 【queryParam不能为空】
    @PostMapping("queryValidate")
    public ValidatedVO queryValidate(@RequestBody @Validated(value= {ValidatedGroup.QUERY.class}) ValidatedVO validatedVO) {
        return validatedVO;
    }
 
    @ApiOperation(value = "分组校验:CREATE参数校验")// 返回 【name不能为空】
    @PostMapping("createValidate")
    public ValidatedVO createValidate(@RequestBody @Validated(value= {ValidatedGroup.CREATE.class}) ValidatedVO validatedVO) {
        return validatedVO;
    }
 
    @ApiOperation(value = "分组校验:UPDATE参数校验") // 返回【id不能为空.name不能为空.】
    @PostMapping("updateValidate")
    public ValidatedVO updateValidate(@RequestBody @Validated(value= {ValidatedGroup.UPDATE.class}) ValidatedVO validatedVO) {
        return validatedVO;
    }
 
    @ApiOperation(value = "分组校验:DELETE参数校验") //返回 【id不能为空】
    @PostMapping("deleteValidate")
    public ValidatedVO deleteValidate(@RequestBody @Validated(value= {ValidatedGroup.DELET.class}) ValidatedVO validatedVO) {
        return validatedVO;
    }
}

到此这篇关于springMVC使用hibernate-validator进行参数校验最佳实践记录的文章就介绍到这了,更多相关springmvc参数校验内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: SpringMVC使用hibernate-validator进行参数校验最佳实践记录

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

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

猜你喜欢
  • SpringMVC使用hibernate-validator进行参数校验最佳实践记录
    在我们用Controller接收参数后,往往需要对参数进行校验。如果我们手写校验的话,就会有一堆的判空代码,看起来很不优雅,写起来也费时费力。下面来看下通过hibernate-val...
    99+
    2024-04-02
  • Spring Boot使用 Hibernate-Validator校验参数时的长度校验
    今天在使用Validator框架数据验证的时候碰到了三个类似的注解,都是用来限制长度,但是用法上有区别: 1,@Size和@Length @Datapublic class LoginVo { @Length(min = 5, ma...
    99+
    2023-09-26
    spring boot hibernate java
  • 使用SpringMVC怎么实现对数据进行校验
    使用SpringMVC怎么实现对数据进行校验?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、导入jar包若要实现数据校验功能,需要导入必要的jar包,主要包括以下几个:c...
    99+
    2023-05-31
    springmvc
  • 如何使用@Valid+BindingResult进行controller参数校验
    这篇文章主要介绍“如何使用@Valid+BindingResult进行controller参数校验”,在日常操作中,相信很多人在如何使用@Valid+BindingResult进行controller参数校验问题上存在疑惑,小编查阅了各式资...
    99+
    2023-06-21
  • 使用@Valid+BindingResult进行controller参数校验方式
    目录@Valid+BindingResult进行controller参数校验Controller层方法的参数校验全局统一异常拦截器@Valid+BindingResult进行cont...
    99+
    2024-04-02
  • 使用Spring MVC怎么对参数进行校验
    本篇文章为大家展示了使用Spring MVC怎么对参数进行校验,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1. 内嵌异常处理如果只是这个controller的异常做单独处理,那么就适合绑定这个co...
    99+
    2023-05-31
    springmvc
  • 使用PHP进行数据可视化的最佳实践
    随着互联网应用的不断增加,数据分析和可视化成为企业和个人不可或缺的一部分。在开发过程中,使用PHP进行数据可视化是一个最为流行的选择。PHP具有简单易学、开发速度快、弹性大等诸多优点,能够帮助开发者快速完成数据可视化任务。本文将分享使用PH...
    99+
    2023-05-25
    实践 PHP 数据可视化
  • Springboot如何使用filter对requestbody参数进行校验
    目录使用filter对request body参数进行校验通过filter修改body参数的思路知识点步骤使用filter对request body参数进行校验 @Slf4j pub...
    99+
    2024-04-02
  • 使用PHP进行PDF生成的最佳实践
    PDF已成为一种受欢迎的文件格式,广泛用于各种场景,包括电子书、报表和证明文件。在PHP中,可以使用多种库和工具来生成PDF文档,但是如何选择最佳实践?以下是使用PHP进行PDF生成的最佳实践:1.选择适当的库PHP中有多个PDF库可供选择...
    99+
    2023-05-23
    实践 PHP PDF
  • 使用PHP和MySQL进行数据备份的最佳实践
    随着企业信息化水平的不断提高,数据备份已经成为了每个企业必须重视的问题。在备份数据的过程中,使用PHP和MySQL进行数据备份已经成为了备受推崇的最佳实践。PHP是一种开源服务器端脚本语言,其拥有简单易学、灵活、可扩展等特点,并且广泛用于互...
    99+
    2023-05-25
    MySQL PHP 数据备份
  • Springboot怎么使用filter对request body参数进行校验
    这篇文章主要为大家展示了“Springboot怎么使用filter对request body参数进行校验”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Springboot怎么使用fil...
    99+
    2023-06-29
  • 使用Golang进行流量管理的最佳实践
    Golang 是一种强大且高效的编程语言,广泛应用于构建网络服务和应用程序。在网络服务中,流量管理是至关重要的一环,它可以帮助我们控制和优化网络上的数据传输,保障服务的稳定性和性能。本...
    99+
    2024-03-07
    实践 golang 流量管理
  • 使用PHP进行协程编程的最佳实践
    随着 Web 应用程序的快速发展,我们需要不断探索更高效的编程方式来满足不断增长的需求。协程编程是一种新的编程方式,它提供了一种替代传统多线程或异步编程的方案。PHP 7.1 后引入了...
    99+
    2024-04-02
  • 使用函数和缓存记录日志:Go 中的最佳实践。
    使用函数和缓存记录日志:Go 中的最佳实践 在 Go 语言中,日志记录是一项非常重要的任务。因为它可以帮助开发人员更好地理解代码的执行流程,诊断和解决问题。在本文中,我们将介绍使用函数和缓存记录日志的最佳实践,以及如何在 Go 中实现它。 ...
    99+
    2023-10-17
    日志 函数 缓存
  • 使用 C++ 函数中的引用参数的最佳实践
    在 c++++ 中使用引用参数时遵循最佳实践至关重要:始终传递非空引用。清楚地标识引用参数。限制对引用参数的修改。避免将引用参数传递给函数。不要返回引用到局部变量。 C++ 函数中的引...
    99+
    2024-04-21
    最佳实践 引用参数 c++ 作用域
  • 使用 C++ 函数中的指针参数的最佳实践
    指针参数函数的 c++++ 最佳实践:明确指针类型。使用引用 (&) 参数修改指针指向位置。检查指针是否有效(是否为 nullptr)。避免悬空指针。 指针参数的 C++ 函数...
    99+
    2024-04-20
    最佳实践 指针参数 c++
  • 使用 PHP 函数进行对象关系映射的最佳实践?
    使用 php 函数进行 orm 的最佳实践:声明强类型化变量以确保数据完整性。妥善处理一对一、一对多和多对多关联。通过 where()、orderby() 和其他函数自定义查询...
    99+
    2024-05-01
    php orm
  • 使用PHP进行电子邮件处理的最佳实践
    随着互联网的发展,电子邮件已经成为人们日常生活中不可或缺的部分。在企业、学校或个人生活中邮件的应用越来越广泛,因此我们需要一个更直观、更优化的方式来处理我们的电子邮件。PHP是一种流行的web编程语言,它提供了许多功能强大且易于使用的邮件处...
    99+
    2023-05-24
    PHP 最佳实践 电子邮件处理
  • 使用Golang进行文件修改操作的最佳实践
    在Golang中进行文件修改操作是一个常见的任务,无论是读取,写入还是更新文件内容,都需要一定的技巧和最佳实践。本文将介绍如何在Golang中进行文件的修改操作,并给出一些具体的代码示...
    99+
    2024-02-29
    - golang - 最佳实践 - 文件操作
  • 在Linux环境下使用NumPy进行数据分析的最佳实践。
    在Linux环境下使用NumPy进行数据分析的最佳实践 NumPy是Python中用于科学计算的一个重要的库,它提供了高效的多维数组对象和各种用于数组操作的函数。在数据科学和机器学习领域,NumPy是必备的工具之一。本文将介绍 安装Num...
    99+
    2023-07-23
    linux numy 索引
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作