springboot中使用Hibernate-Validation校验参数详解

2023-08-06 0 3,305

目录

1、说明

后端接口设计时候,需要对前端请求参数进行'先校验后处理业务'情况,如果在业务代码中通过类似if这里逐个校验,会使得代码变得繁琐,开发工作者都是爱偷懒的。java中,Bean ValidationJavaBean的验证定义了相关的元数据模型和API。

基于Bean-Validation封装,提供了更加丰富的Hibernate-Validation的校验包。也有开发会把这类校验交给前端来处理,但是接口暴露外网会存在直接调用情况(黄牛)。毕竟:前端校验是为了提高用户的体验度,后端校验则是为了保证数据的安全性

优点

1.验证逻辑与业务逻辑之间进行了分离,降低了程序耦合度

2.统一且规范的验证方式,无需你再次编写重复的验证代码

3.你将更专注于你的业务,将这些繁琐的事情统统丢在一边

2、Bean Validation与Hibernate Validation

2.1 Bean Validation中内置的constraint

包位置路径:javax.validation.constraints

springboot中使用Hibernate-Validation校验参数详解

注解 说明
@AssertFalse 注释的元素必须为False
@AssertTrue 注释的元素必须为True
@Email 注释的元素必须邮箱
@NotBlank 注释的元素不能为空,!null && size>0
@NotEmpty 注释的元素不能为空,数组,集合等
@NotNull 注释的元素必须为空,但可以为""字符串
@DecimalMin 注释的元素数字,最小不得小于Min
@DecimalMax 注释的元素为数字,最大不超过Max值

其中NotNull、NotEmpty、NotBlank区别

  • @NotNull
    适用于基本数据类型(Integer,Long,Double等等),当 @NotNull 注解被使用在 String 类型的数据上,则表示该数据不能为 Null(但是可以为 Empty)
  • @NotBlank
    适用于 String 类型的数据上,加了@NotBlank 注解的参数不能为 Null 且 trim() 之后 size > 0
  • @NotEmpty
    适用于 String、Collection集合、Map、数组等等,加了@NotEmpty 注解的参数不能为 Null 或者 长度为 0

2.1 Hibernate Validation中添加的constraint

springboot中使用Hibernate-Validation校验参数详解

注解 说明
@Length 注释的元素字符串长度必须为制定返回内
@Range 注释的元素必须在指定范围内
@URL 注释的元素必须为链接

3、基于Hibernate Validation的实现

(1)pom包引用
查看spring-boot-start-web中已经集成了Hibernate Validation,所以可以不用额外引用包。同时spring-boot-start-validation也完成了Hibernate Validationstart封装(校验机制更加全面)。

 <dependency>
        <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-validation</artifactId>
       <version>2.2.6.RELEASE</version>
</dependency>

(2)Bean对象中使用注解注释

     ...
    @ApiModelProperty(value = \"收货人所在省\",required = true)
    @NotNull(message = \"省不能为空\")
    private String recipientProvince;

    @ApiModelProperty(value = \"收货人所在市\")
    @NotNull(message = \"市不能为空\")
    private String recipientCity;

    @ApiModelProperty(value = \"收货人所在区\")
    @NotNull(message = \"区不能为空\")
    private String recipientDistrict;
    ...

(3)Controller层使用@Valid或者@Validated

 @PostMapping(\"/add\")
 public UniformResultTemplate&lt;Boolean&gt; addAddress(@RequestBody @Validated AddressReqDto reqDto, HttpServletRequest request){
   return null;
 }

注意:Post请求方式区别,Get@Validated注解需要加在 所在方法类前

@RestController
@RequestMapping(\"/api/address\")
@Validated
public class AddressController extends BaseController{
  @ApiOperation(\"收获地址详情\")
    @GetMapping(\"/detail\")
    public UniformResultTemplate<AddressDetailRespDto> queryAddressList(@NotNull(message = \"地址Id不能为空\") 
@RequestParam(value = \"addressId\") Long addressId, HttpServletRequest request){
        return null;
    }
}

(4)使用@ControllerAdvice统一异常处理返回。

@Component
@ControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
    // Post请求Bean中的校验抛出:MethodArgumentNotValidException
    @ExceptionHandler(MethodArgumentNotValidException.class)
    @ResponseBody
    public UniformResultTemplate handleBindException(MethodArgumentNotValidException ex) {
        FieldError fieldError = ex.getBindingResult().getFieldError();
        log.warn(\"参数校验异常:{}({})\", fieldError.getDefaultMessage(),fieldError.getField());
        return new UniformResultTemplate(\"10002\",fieldError.getDefaultMessage());
    }
  // Get请求的参数校验,抛出的是ConstraintViolationException
  @ExceptionHandler(ConstraintViolationException.class)
    @ResponseBody
    public UniformResultTemplate handleGetBindException(ConstraintViolationException ex) {
        Set<ConstraintViolation<?>>  eSet = ex.getConstraintViolations();
        StringBuffer sb = new StringBuffer();
        if(!CollectionUtils.isEmpty(eSet)) {
            Iterator<ConstraintViolation<?>> iterator = eSet.iterator();
            while (iterator.hasNext()) {
                log.warn(\"参数校验异常:{}({})\", iterator.next().getMessage());
                sb.append(iterator.next().getMessage()).append(\"::\");
            }
        }
        return new UniformResultTemplate(\"10002\",sb.toString());
    }
  // 方法签名参数错误
    @ExceptionHandler(MissingServletRequestParameterException.class)
    @ResponseBody
    public UniformResultTemplate handleGetBindException(MissingServletRequestParameterException ex) {
        log.warn(\"参数校验异常:{}\", ex.getMessage());
        return new UniformResultTemplate(\"10002\",ex.getMessage());
    }
}

(5)结果现象

{
    &quot;code": "10002",
    "message": "市不能为空",
    "result": null,
    "totalTimes": null,
    "interfaceTimes": null
}

4、编译器校验工具

防止因使用错误Hibernate-Validation注解而导致程序运行时报错,增加编译器校验工具,进行友好提示。

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator-annotation-processor</artifactId>
    <version>6.1.5.Final</version>
</dependency>

以上就是springboot中使用Hibernate-Validation校验参数详解的详细内容,更多关于springboot Hibernate-Validation的资料请关注其它相关文章!

资源下载此资源下载价格为1小猪币,终身VIP免费,请先
由于本站资源来源于互联网,以研究交流为目的,所有仅供大家参考、学习,不存在任何商业目的与商业用途,如资源存在BUG以及其他任何问题,请自行解决,本站不提供技术服务! 由于资源为虚拟可复制性,下载后不予退积分和退款,谢谢您的支持!如遇到失效或错误的下载链接请联系客服QQ:442469558

:本文采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可, 转载请附上原文出处链接。
1、本站提供的源码不保证资源的完整性以及安全性,不附带任何技术服务!
2、本站提供的模板、软件工具等其他资源,均不包含技术服务,请大家谅解!
3、本站提供的资源仅供下载者参考学习,请勿用于任何商业用途,请24小时内删除!
4、如需商用,请购买正版,由于未及时购买正版发生的侵权行为,与本站无关。
5、本站部分资源存放于百度网盘或其他网盘中,请提前注册好百度网盘账号,下载安装百度网盘客户端或其他网盘客户端进行下载;
6、本站部分资源文件是经压缩后的,请下载后安装解压软件,推荐使用WinRAR和7-Zip解压软件。
7、如果本站提供的资源侵犯到了您的权益,请邮件联系: 442469558@qq.com 进行处理!

猪小侠源码-最新源码下载平台 Java教程 springboot中使用Hibernate-Validation校验参数详解 http://www.20zxx.cn/806588/xuexijiaocheng/javajc.html

猪小侠源码,优质资源分享网

常见问题
  • 本站所有资源版权均属于原作者所有,均只能用于参考学习,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担
查看详情
  • 最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,建议提前注册好百度网盘账号,使用百度网盘客户端下载
查看详情

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务