微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Validation 参数校验

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

目录

一、基本使用

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);
}

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

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

原文地址:https://www.jb51.cc/wenti/3286030.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐