• Spring Boot 整合Hibernate Validator


    Spring Boot 整合Hibernate Validator


    代码仓库: https://github.com/Rain-with-me/JavaStudyCode/tree/main/3-springboot-validator


    依赖


        <dependencies>
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starterartifactId>
            dependency>
    
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-testartifactId>
                <scope>testscope>
            dependency>
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-webartifactId>
            dependency>
            <dependency>
                <groupId>org.hibernate.validatorgroupId>
                <artifactId>hibernate-validatorartifactId>
                <version>6.2.0.Finalversion>
            dependency>
        dependencies>
    

    controller


    • 记得添加 @Validated
    @RestController
    @Validated
    public class TestController {
    
        @PostMapping("/valid")
        public String validator(@NotBlank(message = "{required}") String name,
                                @Email(message = "{invalid}") String email){
            return "success--->普通传参";
        }
    
        @PostMapping("test2")
        public String user(@Valid User user) {
            return "success---->对象";
        }
    }
    

    entity


    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public class User implements Serializable {
        private static final long serialVersionUID = -2731598327208972274L;
    
        @NotBlank(message = "{required}")
        private String name;
    
        @Email(message = "{invalid}")
        private String email;
    }
    

    ValidationMessages.properties 配置 message 的参数



    image-20220917124438855


    全局异常处理


    • 未添加异常时

    image-20220917104819150


    • 添加全局异常

    image-20220917104811550



    代码

    • 里面的 @Order(value = Ordered.HIGHEST_PRECEDENCE) 参数越小,优先级越高
    import org.apache.commons.lang3.StringUtils;
    import org.springframework.core.Ordered;
    import org.springframework.core.annotation.Order;
    import org.springframework.http.HttpStatus;
    import org.springframework.validation.BindException;
    import org.springframework.validation.FieldError;
    import org.springframework.web.bind.annotation.ExceptionHandler;
    import org.springframework.web.bind.annotation.ResponseStatus;
    import org.springframework.web.bind.annotation.RestControllerAdvice;
    
    import javax.validation.ConstraintViolation;
    import javax.validation.ConstraintViolationException;
    import javax.validation.Path;
    import java.util.List;
    import java.util.Set;
    
    
    @RestControllerAdvice
    @Order(value = Ordered.HIGHEST_PRECEDENCE)
    public class GlobalExceptionHandler {
    
        /**
         * 统一处理请求参数校验(普通传参)
         */
        @ExceptionHandler(ConstraintViolationException.class)
        @ResponseStatus(HttpStatus.BAD_REQUEST)
        public String handleConstraintViolationException(ConstraintViolationException e) {
            StringBuilder message = new StringBuilder();
            Set> violations = e.getConstraintViolations();
            for (ConstraintViolation violation : violations) {
                Path path = violation.getPropertyPath();
                String[] pathArr = StringUtils.splitByWholeSeparatorPreserveAllTokens(path.toString(), ".");
                message.append(pathArr[1]).append(violation.getMessage()).append(",");
            }
            message = new StringBuilder(message.substring(0, message.length() - 1));
            return message.toString();
        }
    
        /**
         * 统一处理请求参数校验(实体对象传参)
         */
        @ExceptionHandler(BindException.class)
        @ResponseStatus(HttpStatus.BAD_REQUEST)
        public String validExceptionHandler(BindException e) {
            StringBuilder message = new StringBuilder();
            List fieldErrors = e.getBindingResult().getFieldErrors();
            for (FieldError error : fieldErrors) {
                message.append(error.getField()).append(error.getDefaultMessage()).append(",");
            }
            message = new StringBuilder(message.substring(0, message.length() - 1));
            return message.toString();
    
        }
    }
    
    



    其他注解的使用

    • Bean Validation 中内置的 constraint
    @Valid 被注释的元素是一个对象,需要检查此对象的所有字段值
    @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) 被注释的元素必须符合指定的正则表达式
    
    • Hibernate Validator 附加的 constraint
    @Email 被注释的元素必须是电子邮箱地址
    @Length(min=, max=) 被注释的字符串的大小必须在指定的范围内
    @NotEmpty 被注释的字符串的必须非空
    @Range(min=, max=) 被注释的元素必须在合适的范围内
    @NotBlank 被注释的字符串的必须非空
    @URL(protocol=,
    host=, port=,
    regexp=, flags=) 被注释的字符串必须是一个有效的url
    
    @CreditCardNumber
    被注释的字符串必须通过Luhn校验算法,
    银行卡,信用卡等号码一般都用Luhn
    计算合法性
    
    @ScriptAssert
    (lang=, script=, alias=) 要有Java Scripting API 即JSR 223
    (“Scripting for the JavaTM Platform”)的实现
    @SafeHtml
    (whitelistType=,
    additionalTags=) classpath中要有jsoup包
    
    hibernate补充的注解中,最后3个不常用,可忽略。
    
    主要区分下@NotNull @NotEmpty @NotBlank 3个注解的区别:
    
    @NotNull 任何对象的value不能为null
    
    @NotEmpty 集合对象的元素不为0,即集合不为空,也可以用于字符串不为null
    
    @NotBlank 只能用于字符串不为null,并且字符串trim()以后length要大于0
    
  • 相关阅读:
    基于AI算法+视频监控技术的智慧幼儿园解决方案
    腾讯云MySQL数据库有哪些优势?应用于哪些场景?
    C# .Net 发布后,把dll全部放在一个文件夹中,让软件目录更整洁
    【系统设计】设计一个限流组件
    分布式数据库选型之争:数据库向左,中间件向右
    LeetCode算法日记:1224. 最大相等频率
    Maven依赖管理项目构建工具(保姆级教学---下篇)
    学编程少走弯路
    【100天精通Python】Day71:Python可视化_一文掌握Seaborn库的使用《一》_数据分布可视化,数据关系可视化,示例+代码
    游戏联运和游戏代理的区别
  • 原文地址:https://www.cnblogs.com/rain-me/p/16702405.html