Spring Boot 整合Hibernate Validator

Spring Boot 整合Hibernate Validator

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

依赖


            org.springframework.boot
            spring-boot-starter

            org.springframework.boot
            spring-boot-starter-test
            test

            org.springframework.boot
            spring-boot-starter-web

            org.hibernate.validator
            hibernate-validator
            6.2.0.Final

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 的参数

Spring Boot 整合Hibernate Validator

全局异常处理

  • 未添加异常时

Spring Boot 整合Hibernate Validator
  • 添加全局异常

Spring Boot 整合Hibernate Validator

代码

  • 里面的 @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

Original: https://www.cnblogs.com/rain-me/p/16702405.html
Author: 雨同我
Title: Spring Boot 整合Hibernate Validator

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/621518/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • SpringCloud: 服务配置中心Caused by: com.jcraft.jsch.JSchException: Auth fail

    问题 配置 server: port: 3344 spring: application: name: cloud-config-center cloud: config: ser…

    Java 2023年6月7日
    0103
  • 常见的垃圾回收机制

    如何工作 在某些 Java 虚拟机中,堆的实现截然不同:它更像一个传送带,每分配一个新对象,它就向前移动一格。这意味着对象存储空间的分配速度特别快。Java 的”堆指针…

    Java 2023年6月15日
    075
  • spring中为类类型的属性赋值

    1 ref:引用IOC容器中的某个bean的id 2 内部bean,只能在当前bean的内部使用,不能之间通过IOC容器获取 3 级联的方式,要保证提前为clazz属性进行赋值或者…

    Java 2023年6月16日
    057
  • Spring Cloud Alibaba 使用Feign进行服务消费

    Feign可以把Rest的请求进行隐藏,伪装成类似SpringMVC的Controller一样。你不用再自己拼接url,拼接参数等等操作,一切都交给Feign去做。 将需要使用fe…

    Java 2023年6月5日
    087
  • 如何使用Spark ALS实现协同过滤

    如何使用Spark ALS实现协同过滤 posted @2017-10-12 18:12 花弄影 阅读(605 ) 评论() 编辑 Original: https://www.cn…

    Java 2023年6月16日
    073
  • 为何在JDK安装路径下存在两个JRE?

    “两个jre”和”三个lib”的功能简单扼要的解释 安装JDK后,Java目录下有jdk和jre两个文件夹,但jdk下还有一个jre…

    Java 2023年5月30日
    079
  • CSharp:Observer Pattern

    csharp;gutter:true; /// /// Summary description for Observer.</p> <pre><cod…

    Java 2023年6月16日
    075
  • Mybatis-Plus

    国产的开源框架,基于 MyBatis 核心功能就是简化 MyBatis 的开发,提高效率。 Spring Boot(2.3.0) + MyBatis Plus(国产的开源框架,并没…

    Java 2023年6月15日
    096
  • Spring Security默认的用户登录表单 页面源代码

    Spring Security默认的用户登录表单 页面源代码 <html><head><title>Login Pagetitle>hea…

    Java 2023年5月30日
    066
  • 深入理解 Java 并发锁

    📦 本文以及示例源码已归档在javacore 一、并发锁简介 确保线程安全最常见的做法是利用锁机制( Lock、 sychronized)来对共享数据做互斥同步,这样在同一个时刻,…

    Java 2023年5月29日
    064
  • 安装RocketMQ出现问题找不到主类

    解决:1、确定安装路径没有空格 2、去修改下面文件 确定这里有双引号 posted @2022-07-31 18:20 大大怪下士 阅读(37 ) 评论() 编辑 Original…

    Java 2023年6月9日
    071
  • 常用Linux命令之文件相关命令(一)

    一、文件显示命令 1、cat命令: cat命令连接文件并打印到标准输出设备上,经常用来显示文件的内容,相当于DOS下的type命令 cat命令的一般格式: cat [选项] 文件名…

    Java 2023年6月8日
    0131
  • Docker系列-docker-compose安装

    1.简介 我们知道使用一个 Dockerfile 模板文件,可以让用户很方便的定义一个单独的应用容器。然而,在日常工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要…

    Java 2023年6月8日
    067
  • Java自动化审计(上篇)

    本文是 i 春秋论坛作家「Wker」表哥分享的技术文章,文章旨在为大家提供更多的学习方法与技能技巧,文章仅供学习参考。 CodeQl CodeQL是一个免费开源的代码语义分析引擎(…

    Java 2023年5月29日
    069
  • Spring mvc源码分析系列–Servlet的前世今生

    Spring mvc源码分析系列–Servlet的前世今生 概述 上一篇文章Spring mvc源码分析系列–前言挖了坑,但是由于最近需求繁忙,一直没有时间…

    Java 2023年6月8日
    086
  • Spring Cloud Alibaba 介绍及工程准备

    SpringCloud Alibaba是阿里巴巴集团开源的一套微服务架构解决方案。 微服务架构是为了更好的分布式系统开发,将一个应用拆分成多个子应用,每一个服务都是可以独立运行的子…

    Java 2023年6月5日
    060
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球