Validation 参数校验

spring参数校验Validation 在实际开发中,我们无法保证客户端传来的请求都是合法的。比如一些要求必传的参数没有传递,传来的参数长度不符合要求等,这种时候如果放任不管,继续执行后续业务逻辑,很有可能就会出现意想不到的bug。有人可能会说,这不是前端的问题吗,让前端校验去。话是这么说,但我们也不能前端校验百分百不会出现问题。并且有些请求可能也不是正规通过客户端发来的,可能是黑客恶意攻击,又或是通过Postman等发来的,这些请求就不一定会“合法”了。因此,对客户端传来的每个请求都进行必要的参数校验是十分重要的。 阅读详情

        在开发的过程中,为了确保数据的准确性、可靠性和减少脏数据等,我们时常需要对入参进行校验,以往是通过条件判断去实现参数校验,但是这样费时费力又效果不好,而参数校验对于我们来说是一个非常高效的开发工具。

目录

一、基本使用

1、引入依赖

2、实体类使用

3、Controller层使用

4、结果

5、常见的参数校验

 二、分组校验

1、增加用于辨别的接口类

2、增加group参数配置


一、基本使用

1、引入依赖

<!-- 参数校验 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

2、实体类使用

        给需要进行校验的字段加注解

@Data
@ApiModel(value = "user", description = "用户属性")
public class UserDTO {
    @NotEmpty(message = "姓名不能为空")
    @ApiModelProperty(value = "姓名")
    private String userName;

    @NotNull(message = "年龄不能为空")
    @ApiModelProperty(value = "年龄")
    private Integer userAge;
}
  • @NotEmpty:集合对象的元素不为 0 ,即集合不为空 。
  • @NotNull:不能为 null 。

3、Controller层使用

@PostMapping("/users")
@ApiOperation(value = "查询用户信息")
@ApiOperationSupport(order=1) //api文档排序
public UserVO getUser(@Validated @RequestBody UserDTO dto) {
    return userService.getUser(dto);
}

ValidValidated 区别

     1.分组

@Validated:提供了一个分组功能,可以在入参验证时,根据不同的分组采用不同的验证机制。

@Valid:作为标准JSR-303规范,还没有吸收分组的功能。

     2.注解地方

@Validated:可以用在类型、方法和方法参数上。但是不能用在成员属性(字段)上。

@Valid:可以用在方法、构造函数、方法参数和成员属性(字段)上。

     3.嵌套验证

@Validated:用在方法入参上无法单独提供嵌套验证功能。不能用在成员属性(字段)上,也无法提示框架进行嵌套验证。能配合嵌套验证注解@Valid进行嵌套验证。

@Valid:用在方法入参上无法单独提供嵌套验证功能。能够用在成员属性(字段)上,提示验证框架进行嵌套验证。

4、结果

{
  "code": 500,
  "data": null,
  "msg": "姓名不能为空"
}
{
  "code": 500,
  "data": null,
  "msg": "年龄不能为空"
}

注意:若结果只有报错信息,并没有像我们定义的那样展示提示信息,则需要加上异常捕获再抛出

// 异常捕获
package com.basic.common.core.exception;

import com.basic.common.core.rest.Rest;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/**
 * 异常处理器
 */
@RestControllerAdvice
public class BasicExceptionHandler {
    /**
     * 全局异常捕捉处理
     */
    @ExceptionHandler(value = Exception.class)
    public Rest<?> errorHandler(Exception ex) {
        Rest<?> resultWrapper = new Rest<>();
        if (ex instanceof MethodArgumentNotValidException) {
            MethodArgumentNotValidException exs = (MethodArgumentNotValidException) ex;
            resultWrapper.setCode(500);
            resultWrapper.setMsg(getBindingResultMessage(exs.getBindingResult()));
        }
        return resultWrapper;
    }

    private String getBindingResultMessage(BindingResult bindingResult) {
        StringBuilder sb = new StringBuilder();
        for (ObjectError error : bindingResult.getAllErrors()) {
            sb.append(",").append(error.getDefaultMessage());
        }
        if (sb.length() > 0) {
            sb.deleteCharAt(0);
        }
        return sb.toString();
    }
}

5、常见的参数校验

注解

说明

@Null

限制只能为null

@NotNull

限制必须不为null

@NotBlank

限制字符串不为null,且字符串.trim()以后length要大于0

@NotEmpty

限制集合对象的元素不为0,即集合不为空

@AssertFalse

限制必须为false

@AssertTrue

限制必须为true

@DecimalMax(value) @Max(value)

限制必须为一个不大于指定值的数字

@DecimalMin(value) @Min(value)

限制必须为一个不小于指定值的数字

@Digits(integer,fraction)

限制必须为一个小数,且整数部分位数不能超过integer,小数部分的位数不能超过fraction

@Pattern(value)

限制必须符合指定的正则表达式

@size(max,min)

限制字符长度再min到max之间

@Email

限制字符必须是Email格式,也可以通过正则表达式指定

 二、分组校验

        我们常遇上一个入参对象需要应多多种接口方法,但是有些方法只需要对部分字段进行校验,而另一些方法又只需要对另一部分的字段进行校验,这个时候分组校验就可以满足我们的需求。

1、增加用于辨别的接口类

① 方法一:定义接口类

package com.basic.demo.validation;

public interface AddGroup {
}


-------------------------------


package com.basic.demo.validation;

public interface UpdateGroup {
}

② 方法二:直接在对象下面进行添加

@Data
@ApiModel(value = "user", description = "用户属性")
public class UserDTO {
    @NotEmpty(message = "姓名不能为空")
    @ApiModelProperty(value = "姓名")
    private String userName;

    @NotNull(message = "年龄不能为空")
    @ApiModelProperty(value = "年龄")
    private Integer userAge;
    
    //修改时生效
    public interface UpdateGroup {
    }
    //新增时生效
    public interface AddGroup {
    }    
}

2、增加group参数配置

① 字段标识

@NotEmpty(message = "姓名不能为空", groups = AddGroup.class)
@ApiModelProperty(value = "姓名")
private String userName;

@NotNull(message = "年龄不能为空", groups = {AddGroup.class, UpdateGroup.class})
@ApiModelProperty(value = "年龄")
private Integer userAge;

② 方法入参标识

@PostMapping("/users")
@ApiOperation(value = "查询用户信息")
public Rest<String> getUser(@Validated({AddGroup.class}) @RequestBody UserDTO dto) {
    return Rest.ok("hello");
}
@PostMapping("/users")
@ApiOperation(value = "查询用户信息")
public UserVO getUser(@Validated({AddGroup.class, UpdateGroup.class}) @RequestBody UserDTO dto) {
    return userService.getUser(dto);
}

这样就能实现针对不同的需求制定不同的参数校验啦!

小白也要努力成长起来!欢迎大家指点和讨论!

SpringBoot 使用 Validation 进行参数校验并统一返回校验异常 新建自定义注解java复制代码import com.jk.validator.StatusValidator;String message() default "状态传递有误";Class 阅读详情

相关推荐

JSR303数据校验 —— @Valid嵌套校验集合校验

@Valid嵌套校验、搭配@Validated集合校验

weixin_48568302的博客 960

@Validated验证List集合的方法示例

主要介绍了@Validated验证List集合的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

Validation参数校验拦截返回——Controller参数校验拦截器

日常项目开发中,validation包为后端校验提供了极大的遍历,那么对于校验失败提醒,我们又应该怎么将错误信息封装成json给前端呢? 单刀直入,直接上代码,客官慢用~~~ —————————— 参数校验拦截器 package com.rq.aop.common.handler; import com.alibaba.fastjson.JSON; import com.rq.aop.commo...

咚咚大帝的博客 4774

Java代码简洁-validation参数校验

validation参数校验

weixin_43994244的博客 9111

validation--数据校验

validation,数据校验

qq_15210269的博客 3920

SpringBootvalidation参数校验

在项目开发过程,后端经常会对前端传递的参数进行各种校验,只有在校验通过时,才会执行后续的业务代码,否则抛出异常信息给前端。当参数较多时,刚开始会使用大量的 if…else…来逐一对参数进行检验,或则使用策略模式来方法来减少 if…else…的检验代码。但是将这些代码写在控制层或则业务层都会让代码过于臃肿。而且如果后期参数校验变了,或则参数不需要校验时,还需要大量删除,或修改检验参数的逻辑代码,因此采用 validation来对参数进行校验简化代码。

m0_74823658的博客 1793

Validation参数校验

这里是修真院后端小课堂,每篇分享文从 八个方面深度解析后端知识/技能,本篇分享的是: 【Validation参数校验】 【修真院Java小课堂】Validation参数校验 大家好,我是IT修真院北京分院第35期一枚正直纯洁善良的Java程序员,今天给大家分享一下,修真院官网Java(职业)任务二,深度思考中的知识点——Validation参数校验 背景介绍 数据的校验是交互式网站一个不可或缺...

learning__java的博客 1910

Spring Boot 参数校验 Validation 终极指南

注解使用场景抛出异常@Valid校验对象参数(如 @RequestBody)@Validated校验简单类型参数(如 @RequestParam)@Validated校验对象参数(需配合 @Valid 使用)在大多数项目中,无论是 Bean Validation 定义的约束,还是 Hibernate Validator 附加的约束,都是无法满足我们复杂的业务场景。所以,我们需要自定义约束。1)编写自定义约束的注解;2)编写自定义的校验器 ConstraintValidator。

〆、挽风的博客 2164

Validation参数校验注解

注解 描述 @AssertFalse 被注解的元素必须为false @AssertTrue 被注解的元素必须为True @DecimalMax(value) 被注解的元素必须为一个数字,其值必须小于等于指定的最小值 @DecimalMin(Value) 被注解的元素必须为一个数字,其值必须大于等于指定的最小值 @Digits(integer=, fraction=) 被注解的元素必须为一个数字,其值必须在可接受的范围内 @Future 被注解的元素必须是日期,必须是将来日...

骑个小蜗牛的博客 1万+

SpringBoot中集成参数校验Validation

为了提供可靠的API接口,对参数进行校验,保证数据入库的正确性,同事通过添加注释使用Validation规范避免写一大堆的if -else的校验语句。使代码更加简单清晰。

码农从0到1 1461

SpringBoot参数校验 Validation

数据校验很重要,在前端对数据进行校验的情况下,我们还是要对传入后端的数据再进行一遍校验,避免用户绕过浏览器直接通过一些 HTTP 工具直接向后端请求一些违法数据。 虽然我们通过 if/else 语句对请求的每一个参数一一校验。但是这样写起来太麻烦了,而且破坏了单一职责原则。所以今天我们来看一下 Spring Boot validation 。 首先我们先来看两个注解 @Validated: 可以用在类型、方法和方法参数上。但是不能用在成员属性(字段)上; 用在方法入参上无法单独提供嵌套验证功能;能配合嵌套

tianynnb的博客 1797

Spring-Validation校验参数

Spring-Validation校验参数 全方面使用参数校验工具 //被注释的元素,值必须是一个字符串,不能为null,且调用trim()后,长度必须大于0 @NotBlank(message="") //被注释的元素,值不能为null,但可以为"空",用于基本数据类型的非空校验上,而且被其标注的字段可以使用@size、@Max、@Min等对字段数值进行大小的控制 @NotNull(message="") //被注释的的元素,值不能为null,且长度必须大于0,一般用在集合类上面 @...

牧风人的博客 2320
上一篇: SpringBoot整合knife和swagger3
下一篇: IO-字符流、字节流
L晶晶zz
博客等级 码龄6年 41粉丝 · 5原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值