SpringBoot集成Validation参数校验

本文实例为大家分享了SpringBoot集成Validation参数校验的具体代码,供大家参考,具体内容如下

1、依赖

SpringBoot在web启动器中已经包含validator包

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
</dependency>

非SpringBoot项目,需要自定引入依赖

<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>6.1.5.Final</version>
</dependency>
<dependency>
    <groupOd>org.glassfish</groupId>
    <artifactId>jakarta.el</artifactId>
    <version>3.0.3</version>
</dependency>

2、常用约束说明

package com.smile.project.validator.utils;
 
public class 常用约束说明 {
 
    /**
     * @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(regex=,flag=):指定的正则表达式
     * @URL:必须是一个URL
     * @Email:必须是email格式
     * @NotBlank:字符串不能为空
     * @NotEmpty:集合不能为空
     * @Length:长度必须在指定范围内
     * @Valid:对实体类进行校验
     */
 
}

3、实体约束示例

import com.smile.project.validator.utils.Gender;
import lombok.Data;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
 
@Data
public class SysUser {
 
    private Long id;
 
    @NotNull(message = "用户名不能为空")
    @Size(min = 3,max = 5,message = "用户名长度为{min}-{max}之间")
    private String username;
 
    @NotNull(message = "昵称不能为空")
    private String name;
 
    @NotNull(message = "密码不能为空")
    private String password;
 
    @Email(message = "邮箱格式不合法")
    private String email;
 
    private String gender;
 
}

4、控制层示例

需要在class加上@Validated注解

如果参数时实体,需要加上@Valid注解

import com.smile.project.validator.entity.SysUser;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
 
@RestController
@Validated
public class SysUserController {
 
    /**
     * 方法参数为实体校验
     */
    @PostMapping("/register")
    public ResponseEntity register(@Valid SysUser sysUser){
        return ResponseEntity.ok(sysUser);
    }
 
    /**
     * 方法参数校验
     */
    @GetMapping("user")
    public ResponseEntity getUser(@NotNull(message = "用户名不能为空") String username){
        SysUser sysUser = new SysUser();
        sysUser.setName("smile");
        return ResponseEntity.ok(sysUser);
    }
 
}

5、异常捕获

全局异常捕获,当出现参数校验不合法时捕获异常,并且返回给前端

import org.springframework.http.ResponseEntity;
import org.springframework.validation.FieldError;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import java.util.HashMap;
import java.util.List;
import java.util.Set;
 
/**
 * 全局异常捕获
 * 当出翔参数校验不合法时捕获异常,并且返回给前端
 */
@ControllerAdvice
public class GlobHandler {
 
    /**
     * 捕获方法参数校验异常
     */
    @ExceptionHandler(ConstraintViolationException.class)
    @ResponseBody
    public ResponseEntity constraintViolationExceptionHandler(ConstraintViolationException e){
        Set<ConstraintViolation<?>> message = e.getConstraintViolations();
        HashMap<String,Object> map = new HashMap<>();
        message.stream().forEach(msg ->{
            String path = msg.getPropertyPath().toString();
            String field = path.substring(path.indexOf(".")+1);
            map.put(field,msg.getMessageTemplate());
        });
        return ResponseEntity.ok(map);
    }
 
    /**
     * 捕获实体参数校验异常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    @ResponseBody
    public ResponseEntity resolveMethodArgumentNotValidException(MethodArgumentNotValidException e){
        List<ObjectError> allErrors = e.getBindingResult().getAllErrors();
        HashMap<String,Object> map = new HashMap<>();
        allErrors.stream().forEach(error -> {
            FieldError fieldError = (FieldError) error;
            map.put(fieldError.getField(),fieldError.getDefaultMessage());
        });
        return ResponseEntity.ok(map);
    }
 
}

6、自定义校验规则

特殊的字段需要自定义规则,比如身份证号码,邮箱,电话等

6.1、定义校验注解

import com.smile.project.validator.utils.GenderValidator;
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
 
/**
 * 定义校验注解
 */
@Target({METHOD,FIELD})
@Retention(RUNTIME)
@Constraint(validatedBy = GenderValidator.class)
@Documented
public @interface Gender {
 
    String message() default "性别为男或者女";
 
    Class<?>[] groups() default {};
 
    Class<? extends Payload[]>[] payload() default {};
 
}

6.2、GenderValidator实现ConstraintValidator接口并提供校验规则

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
 
/**
 * 实现ConstraintValidator接口并提供校验规则
 */
public class GenderValidator implements ConstraintValidator<Gender,String> {
 
    //初始化校验值
    @Override
    public void initialize(Gender constraintAnnotation) {
 
    }
 
    //检验规则
    @Override
    public boolean isValid(String value, ConstraintValidatorContext content) {
        return "男".equals(value) || "女".equals(value);
    }
}

6.3、在成员变量中使用注解

import com.smile.project.validator.utils.Gender;
import lombok.Data;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
 
@Data
public class SysUser {
 
    private Long id;
 
    @NotNull(message = "用户名不能为空")
    @Size(min = 3,max = 5,message = "用户名长度为{min}-{max}之间")
    private String username;
 
    @NotNull(message = "昵称不能为空")
    private String name;
 
    @NotNull(message = "密码不能为空")
    private String password;
 
    @Email(message = "邮箱格式不合法")
    private String email;
 
    @Gender()
    private String gender;
 
}

7、分组校验

默认情况下,不指定分组都属于默认组;使用分组校验有利于分层校验开发

7.1、新建两个接口,一个用于查询,一个用于添加

public interface ADD extends Default {
 
}
 
public interface Select extends Default {
 
}

7.2、修改尸体校验规则,如果不指定分组默认时Default组;

import com.smile.project.validator.utils.Gender;
import lombok.Data;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
 
@Data
public class SysUser {
 
    private Long id;
 
    @NotNull(message = "用户名不能为空",groups = ADD.class)
    @Size(min = 3,max = 5,message = "用户名长度为{min}-{max}之间")
    private String username;
 
    @NotNull(message = "昵称不能为空",groups = Select.class)
    private String name;
 
    @NotNull(message = "密码不能为空",groups = ADD.class)
    private String password;
 
    @Email(message = "邮箱格式不合法",groups = Select.class)
    private String email;
 
    @Gender()
    private String gender;
 
}

7.3、控制层示例,此时只会校验ADD组和Default组

//分组校验
@PostMapping("/user")
public ResponseEntity addUser(@Validated(value = ADD.class) @RequestBody SysUser sysUser){
    return ResponseEntity.ok(sysUser);
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • SpringBoot + validation 接口参数校验的思路详解

    有参数传递的地方都少不了参数校验.在web开发中,前端的参数校验是为了用户体验,后端的参数校验是为了安全.试想一下,如果在controller层中没有经过任何校验的参数通过service层.dao层一路来到了数据库就可能导致严重的后果,最好的结果是查不出数据,严重一点就是报错,如果这些没有被校验的参数中包含了恶意代码,那就可能导致更严重的后果. 实践 一.引入依赖 <!--引入spring-boot-starter-validation--> <dependency> <gr

  • springboot+dubbo+validation 进行rpc参数校验的实现方法

    注意:本文dubbo 版本 2.8.4 springboot 版本 2.0.4.RELEASE 项目结构 test-rest (前端消费着,controller 层,springboot+maven项目) test-api (dubbo服务 的 api ,只记录 service 接口和 model ,maven 项目) test-provider(dubbo 服务提供者,实际的数据库操作及业务层, springboot+maven项目 ) 背景: 使用springmvc做restful,使用du

  • SpringBoot使用validation做参数校验的实现步骤

    1.添加依赖 直接添加 hibernate-validator <dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> <version>6.0.2.Final</version> </dependency> 添加spring-boot-starter-validat

  • springboot使用hibernate validation对参数校验的实现方法

    springboot天生支持使用hibernate validation对参数的优雅校验,如果不使用它,只能对参数挨个进行如下方式的手工校验,不仅难看,使用起来还很不方便: if(StringUtils.isEmpty(userName)){ throw new RuntimeException("用户名不能为空"); } 下面将介绍hibernate validation的基本使用方法. 一.引入依赖 这里在springboot 2.4.1中进行实验,引入以下依赖: <pare

  • SpringBoot使用validation-api实现参数校验的示例

    我们在开发Java项目的时候,经常需要对参数进行一些必填项.格式.长度等进行校验,如果手写代码对参数校验,每个接口会需要很多低级的代码,这样会降低代码的可读性.那么我们能不能使用一种比较优雅的方式来实现,对请求中的参数进行校验呢? knife4j的安装与使用可参考我的博客:SpringBoot使用knife4j进行在线接口调试 正文 ValidationApi框架就是用来解决参数校验中代码冗余问题,ValidationApi框架提供一些注解用来帮助我们对请求参数进行校验: SpringBoot使

  • SpringBoot使用validation-api实现对枚举类参数校验的方法

    前言 之前写了一个博客是关于使用SpringBoot使用validation-api实现参数校验,当时使用的注解都是validation-api自带的注解只能完成对空值.长度等简单的校验,在我们日常的使用当中会遇到对参数是否在枚举值类的校验,针对这种情况我们怎么来实现呢? SpringBoot使用validation-api实现参数校验可参考我的博客:SpringBoot使用validation-api实现参数校验 正文 SpringBoot使用validation-api实现对枚举类参数校验

  • SpringBoot集成Validation参数校验

    本文实例为大家分享了SpringBoot集成Validation参数校验的具体代码,供大家参考,具体内容如下 1.依赖 SpringBoot在web启动器中已经包含validator包 <dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-web</artifactId> </dependency>

  • Springboot集成JSR303参数校验的方法实现

    JSR303 是一套 JavaBean 参数校验的标准 1.pom导入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency> 2.注解类型 (1)空检查 @Null 验证对象是否为null @NotNull 验证对象是否不为null,

  • SpringBoot集成validation校验参数遇到的坑

    公众号中分享了一篇文章,关于SpringBoot集成validation校验参数的,粉丝留言说有坑. 原留言如下: 有坑,你试试^A-\\d{12}-\\d{4}$,这条正则经过validate这个方法无论参数写的对不对都会报验证错误,而用main方法测试是正常的.. 话说,针对这种回复我是不太信了,直觉告诉我,肯定是这位粉丝用错了.但既然粉丝有疑问还是需要专门写一个demo来验证一下的.说写就写. SpringBoot集成validation 集成过程非常简单,在原项目的pom文件中直接引入如

  • SpringBoot如何进行参数校验实例详解

    目录 前言 为什么需要参数校验 SpringBoot中集成参数校验 第一步,引入依赖 第二步,定义要参数校验的实体类 第三步,定义校验类进行测试 第四步,体验效果 参数异常加入全局异常处理器 体验效果 自定义参数校验 第一步,创建自定义注解 第二步,自定义校验逻辑 第三步,在字段上增加注解 第四步,体验效果 分组校验 第一步:定义分组接口 第二步,在模型中给参数分配分组 第三步,给需要参数校验的方法指定分组 第四步,体验效果 小结 总结 前言 今天我们继续聊聊在SprinBoot中如何集成参数校

  • 详解SpringBoot中的参数校验(项目实战)

    Java后端发工作中经常会对前端传递过来的参数做一些校验,在业务中还要抛出异常或者不断的返回异常时的校验信息,充满了if-else这种校验代码,在代码中相当冗长.例如说,用户注册时,会校验手机格式的正确性,用户名的长度等等.虽说前端也可以做参数校验,但是为了保证我们API接口的可靠性,以保证最终数据入库的正确性,后端进行参数校验不可忽视. Hibernate Validator 提供了一种统一方便的方式,让我们快速的实现参数校验. Hibernate Validator 使用注解,实现声明式校验

  • spring boot validation参数校验实例分析

    本文实例讲述了spring boot validation参数校验.分享给大家供大家参考,具体如下: 对于任何一个应用而言在客户端做的数据有效性验证都不是安全有效的,这时候就要求我们在开发的时候在服务端也对数据的有效性进行验证. Spring Boot自身对数据在服务端的校验有一个比较好的支持,它能将我们提交到服务端的数据按照我们事先的约定进行数据有效性验证. 1 pom依赖 <dependency> <groupId>org.springframework.boot</gr

  • SpringBoot参数校验Validator框架详解

    目录 SpringBoot 如何进行参数校验 1.集成Validator校验框架 1.1. 引入依赖包 1.2. 定义要参数校验的实体类 1.3. 定义校验类进行测试 1.4. 测试结果1 1.5. 问题 1.6. 将参数异常加入全局异常 1.7. 测试结果2 2. 自定义注解 2.1. 第一步,创建自定义注解 2.2. 第二步,自定义校验逻辑 2.3. 第三步,在字段上增加注解 2.4. 第四步,体验效果 3. 分组校验 3.1. 第一步,定义分组接口 3.2. 第二步,在模型中给参数分配分组

  • SpringBoot中的异常处理与参数校验的方法实现

    兄弟们好,这次来跟老铁交流两个问题,异常和参数校验,在说参数校验之前我们先来说异常处理吧,因为后面参数的校验会牵扯到异常处理这块的内容. 异常处理 说到异常处理,我不知道大家有没有写过或者遇到过如下的写法. public void saveUser() { try { // 所有的业务内容,目测几百行 }catch (Exception e) { e.printStackTrace(); } } 如果出现上述的代码,里面包含了大量的业务代码,如果是你写的,赶紧改掉,不是你写的找写的,吐槽赶紧改掉

随机推荐