首页 > 其他分享 >Spring Validation使用小结

Spring Validation使用小结

时间:2023-12-21 13:44:49浏览次数:25  
标签:验证 Spring 校验 springframework 注解 import 2.1 Validation 小结

目录

1、背景

Spring 框架,广泛应用于 JAVA 企业级开发中,包含了一套实用的字段校验机制: Spring Validation。这个机制融合了 JSR380 规范,即 Bean Validation 2.0。本文将介绍 Spring Validation 的使用方法,包括基础注解的应用以及进阶使用技巧。

2、常用注解

2.1、Bean Validation 2.0 注解

2.1.1、校验空值

  • @Null:验证对象是否为 null
  • @NotNull:验证对象是否不为 null
  • @NotEmpty:验证对象不为 null,且长度(数组、集合、字符串等)大于 0
  • @NotBlank:验证字符串不为 null,且去除两端空白字符后长度大于 0

2.1.2、校验大小

  • @Size(min=, max=):验证对象(数组、集合、字符串等)长度是否在给定的范围之内
  • @Min(value):验证数值(整数或浮点数)是否大于等于指定的最小值
  • @Max(value):验证数值是否小于等于指定的最大值

2.1.3、校验布尔值

  • @AssertTrue:验证 Boolean 对象是否为 true
  • @AssertFalse:验证 Boolean 对象是否为 false

2.1.4、校验日期和时间

  • @Past:验证 Date 和 Calendar 对象是否在当前时间之前
  • @Future:验证 Date 和 Calendar 对象是否在当前时间之后
  • @PastOrPresent:验证日期是否是过去或现在的时间
  • @FutureOrPresent:验证日期是否是现在或将来的时间

2.1.5、正则表达式

  • @Pattern(regexp=, flags=):验证 String 对象是否符合正则表达式的规则

2.1.5.1、验证IP地址

    @Pattern(regexp = "(((25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]\\d|\\d)\\.){3}(25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]\\d|\\d))", message = "IP地址不合法")
    private String ip;

2.1.5.1、验证手机号码

    @Pattern(regexp = "^(13[0-9]|14[5-9]|15[0-3,5-9]|16[6]|17[0-8]|18[0-9]|19[8,9])\\d{8}$", message = "手机号不合法")
    private String username;

3、 使用

3.1、当方法入参为 @PathVariable、 @RequestParam 注解的简单参数时,需要在 Controller 加上 @Validated 注解开启校验

@RestController
@Validated // 必须加上该注解
public class UserController {

  // 路径变量
  @GetMapping("{id}")
  public Reponse<NoticeDTO> detail(@PathVariable("id") @Min(1L) Long noticeId) {
    return Reponse.ok();
  }

  // 请求参数
  @GetMapping("getByTitle")
  public Result getByTitle(@RequestParam("title") @Length(min = 1, max = 20) String  title) {
    return Result.ok();
  }
}

3.2、当方法入参为 @RequestBody 注解的 JavaBean,可在入参前使用 @Validated 注解开启校验

@PostMapping("/save")
public Response<Boolean> execute(@Validated @RequestBody NoticeDTO noticeDTO) {
  return Response.ok(true);
}

4、参数不合法提示

import java.util.List;
import java.util.Objects;
import java.util.Set;

import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;

import org.springframework.util.CollectionUtils;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import com.cnblogs.javalouvre.http.Result;
import com.cnblogs.javalouvre.http.ResultEnum;

@RestControllerAdvice
public class GlobalExceptionAdvice {

    /**
     * {@code @org.springframework.web.bind.annotation.PathVariable} 和 {@code @org.springframework.web.bind.annotation.RequestParam} 参数校验不通过时抛出的异常处理
     */
    @ExceptionHandler(ConstraintViolationException.class)
    public Result<?> handleConstraintViolationException(ConstraintViolationException e) {
        final Set<ConstraintViolation<?>> constraintViolations = e.getConstraintViolations();
        if (!CollectionUtils.isEmpty(constraintViolations)) {
            for (ConstraintViolation<?> constraintViolation : constraintViolations) {
                return Result.failure(ResultEnum.PARAM_IS_INVALID, constraintViolation.getMessage());
            }
        }

        return Result.failure(ResultEnum.PARAM_IS_INVALID);
    }

    /**
     * {@code @org.springframework.web.bind.annotation.RequestBody} 参数校验不通过时抛出的异常处理
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public Result<?> handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
        final BindingResult bindingResult = e.getBindingResult();
        if (Objects.nonNull(bindingResult)) {
            final List<FieldError> fieldErrors = bindingResult.getFieldErrors();
            if (!CollectionUtils.isEmpty(fieldErrors)) {
                for (FieldError fieldError : fieldErrors) {
                    return Result.failure(ResultEnum.PARAM_IS_INVALID, fieldError.getDefaultMessage());
                }
            }
        }

        return Result.failure(ResultEnum.PARAM_IS_INVALID);
    }

}

标签:验证,Spring,校验,springframework,注解,import,2.1,Validation,小结
From: https://www.cnblogs.com/javalouvre/p/17918802.html

相关文章

  • Spring框架的事务管理
    引言事务管理是企业应用程序中不可或缺的一个方面,它确保数据的一致性和完整性。Spring框架提供了一个灵活的事务管理抽象,它可以透明地工作在不同的事务管理API之上。事务管理的基本概念在深入Spring的事务管理之前,让我们回顾几个关键概念:事务(Transaction):一系列的动作,它们被视为一个......
  • 抢先看!Salesforce Spring '24中的10个亮点功能!
    Spring'24来临在即,PreviewOrgs已上线。在Spring'24中,将会为管理员、开发人员和顾问带来更多新功能。在这片云计算的海洋里,一些亮点功能总能在Salesforce生态系统中引起强烈反响。本篇文章为学习者们盘点了Spring'24中的10个亮点功能,一起来先睹为快!Spring'24发布的具体日期......
  • SpringBoot集成Memcached实现高效缓存
    一、前言Memcached是一款高性能的分布式内存对象缓存系统,可以用来缓存SQL查询结果、API调试结果等。使用Memcached可以减少对数据库的查询次数,提高系统性能。它主要用于减轻数据库负载,提供应用系统,减少数据库压力。SpringBoot可以快速集成Memcached实现对缓存到读写操作。二、安装......
  • SpringBoot整合Dubbo常用注解类说明
    SpringBoot与Dubbo的整合pom依赖:<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.spr......
  • Spring Boot —— Caffeine(内存缓存器)
    项目中需要用一个替代concurrenthashmap能够帮忙过期或者防止一直putoom所以使用 优点内存管理优化Caffeine使用了一种基于堆外内存的存储模型,通过直接内存访问,避免了Java堆内存的垃圾回收开销。这种内存管理优化可以减少垃圾回收对应用性能的影响,提供更高的缓存读写性能......
  • Spring Boot原理分析 | SpringApplication、Yaml、Properties
    ......
  • 如何用MyEclipse搭建JSF/Primefaces和Spring(一)
    本教程将引导大家完成为JavaServerFaces(JSF)生成软件组件的过程,在本文中您将学习到如何:从数据库表到现有项目搭建配置支持JSF2.0的服务器部署搭建的应用程序自定义Spring代码生成需要MyEclipse Spring或Bling授权。MyEclipsev2023.1.2离线版下载MyEclipse技术交流群......
  • Spring Boot 3.2 + CRaC = 王炸!
    原文:https://foojay.io/today/springboot-3-2-crac/前段时间发布了Spring6.1和SpringBoot3.2,它们都完全支持CRaC(检查点协调恢复)。如果你想了解有关CRaC的更多信息,请随时阅读此处:https://docs.azul.com/core/crac/crac-introductionCRaC是一个OpenJDK项目,可以“快......
  • Spring基于注解的IOC配置
    目录基于注解的IOC配置1、用于创建对象的注解2、用于注入数据的3、用于改变作用范围的和生命周期相关基于注解的IOC配置曾经XML的配置<beanid="accountService"class="com.zjw.service.impl.AccountServiceImpl"scope=""init-method=""destroy-method=""><pro......
  • 【SpringBootWeb入门-16】Mybatis-基础操作-多条件查询操作&XML文件配置SQL
    1、章节回顾上一篇文章我们讲解了Mybatis的增改查操作,本篇继续学习Mybatis的复杂查询操作(多条件查询)。2、增删改查操作-多条件查询操作根据条件姓名、性别、入职时间来查询员工表emp数据,其中员工姓名支持模糊匹配,性别进行精确匹配,入职时间进行范围查询,查询结果按照最后修改时间......