zoukankan      html  css  js  c++  java
  • SpringBoot整合Hibernate Validator实现参数验证功能

      在前后端分离的开发模式中,后端对前端传入的参数的校验成了必不可少的一个环节。但是在多参数的情况下,在controller层加上参数验证,会显得特别臃肿,并且会有许多的重复代码。这里可以引用Hibernate Validator来解决这个问题,直接在实体类进行参数校验,验证失败直接返回错误信息给前端,减少controller层的代码量。

    一、pom引入Hibernate Validator

    <!-- 验证器 -->
    <dependency>
          <groupId>org.hibernate.validator</groupId>
          <artifactId>hibernate-validator</artifactId>
          <version>6.1.5.Final</version>
    </dependency>

     二、通过注解在实体类进行参数校验

    @Data
    public class UserModel {
    
        @NotNull(message = "用户名称不能为空!")
        private String userName;
    
        @NotNull(message = "age不能为null!")
        @Range(min = 1, max = 888, message = "范围为1至888")
        private Integer age;
    
        /**
         * 日期格式化转换
         */
        @NotNull(message = "日期不能为null!")
        private Date date;
    }

    这里用到的参数校验的注解有@NotNull和@Range,message是到时候我们返回给前端的信息,注解的具体意思如下:

    @Null  被注释的元素必须为null
    @NotNull  被注释的元素不能为null
    @AssertTrue  被注释的元素必须为true
    @AssertFalse  被注释的元素必须为false
    @Min(value)  被注释的元素必须是一个数字,其值必须大于等于指定的最小值
    @Max(value)  被注释的元素必须是一个数字,其值必须小于等于指定的最大值
    @DecimalMin(value)  被注释的元素必须是一个数字,其值必须大于等于指定的最小值
    @DecimalMax(value)  被注释的元素必须是一个数字,其值必须小于等于指定的最大值
    @Size(max,min)  被注释的元素的大小必须在指定的范围内。
    @Digits(integer,fraction)  被注释的元素必须是一个数字,其值必须在可接受的范围内
    @Past  被注释的元素必须是一个过去的日期
    @Future  被注释的元素必须是一个将来的日期
    @Pattern(value) 被注释的元素必须符合指定的正则表达式。
    @Email 被注释的元素必须是电子邮件地址
    @Length 被注释的字符串的大小必须在指定的范围内
    @NotEmpty  被注释的字符串必须非空
    @Range  被注释的元素必须在合适的范围内

     三、controller层的方法加上@Valid注解

    @PostMapping("/testPost")
    public Object testPost(@RequestBody @Valid UserModel userModel, BindingResult result){
    if(result.hasErrors()){
    for(ObjectError error:result.getAllErrors()){
    return error.getDefaultMessage();
    }
    }
    return userModel;
    }

    controller层这里只需要在实体类的前面加上@Valid注解,这个注解可以实现数据的验证。这里BindingResult是存储了校验时的错误信息,验证有误时将错误信息返回给前端。这里不使用BindingResult的时候,控制台会报MethodArgumentNotValidException,这里可以通过自定义异常类来捕捉它,然后去掉BindingResult,以及难看的if判断。

    四、自定义异常类捕捉MethodArgumentNotValidException

    @RestControllerAdvice
    public class GlobalExceptionAdvice {
    
        @ExceptionHandler(value = MethodArgumentNotValidException.class)
        public JsonData validException(MethodArgumentNotValidException e) {
            //验证post请求的参数合法性
            MethodArgumentNotValidException notValidException = e;
            String msg = notValidException.getBindingResult().getFieldError().getDefaultMessage();
            return JsonData.buildError(msg);
        }
    }

    使用PostMan的测试结果如下:

    具体的代码可以在我的github上面查看https://github.com/ruiyeclub/SpringBoot-Hello

  • 相关阅读:
    oracle中Blob和Clob类型的区别
    为什么要分库分表
    Enable file editing in Visual Studio's debug mode
    SQL Server Dead Lock Log
    Debug .NET Framework Source
    SQL Server text field里面有换行符的时候copy到excel数据会散乱
    诊断和修复Web测试记录器(Web Test Recorder)问题
    Can't load Microsoft.ReportViewer.ProcessingObjectModel.dll
    'telnet' is not recognized as an internal or external command
    Linq to XML
  • 原文地址:https://www.cnblogs.com/ruiyeclub/p/13141467.html
Copyright © 2011-2022 走看看