springboot中使用validation-api进行参数验证

1.在pom.xml文件引入依赖:

<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
    <version>2.0.1.Final</version>
</dependency>

2.内部注释对象:

在这里插入图片描述

@AssertFalse:用于boolean字段,该字段只能为true
@AssertTrue:用于boolean字段,该字段只能为false
@DecimalMax(value=x):验证注解的元素值小于等于@ DecimalMax指定的value值
@DecimalMin(value=x):验证注解的元素值大于等于@ DecimalMin指定的value值
@Digits(integer=整数位数, fraction=小数位数):验证注解的元素值的整数位数和小数位数上限
@Email:验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式
@Future(integer=整数位数, fraction=小数位数):验证注解的元素值(日期类型)比当前时间晚
@FutureOrPresent(integer=整数位数, fraction=小数位数):验证注解的元素值(日期类型)比当前时间晚或者等于当前时间
@Max(value=x):验证注解的元素值小于等于@Max指定的value值
@Min(value=x):验证注解的元素值大于等于@Max指定的value值
@Negative:
@NegativeOrZero:
@NotBlank:验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的空格
@NotEmpty:验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0)
@NotNull:验证注解的元素值不是null
@Null:验证注解的元素值是null
@Past:验证注解的元素值(日期类型)比当前时间早
@PastOrPresent:验证注解的元素值(日期类型)比当前时间早或等于现在
@Pattern(regex=正则表达式, flag=):验证注解的元素值与指定的正则表达式匹配
@Positive:
@PositiveOrZero:
@Size(min=最小值, max=最大值):验证注解的元素值的在min和max(包含)指定区间之内,如字符长度、集合大小

3.自定义一个验证对象的方法:

主要通过Validation类去构建一个Validator的对象,执行Validator的validate方法,返回错误的验证结果集合,如果有错误就抛出异常,在@RestControllerAdvice类中处理ValidationException异常,把错误信息返回到接口。

package com.lz.hehuorenservice.common.tool;

import com.alibaba.fastjson.JSON;
import org.springframework.util.CollectionUtils;

import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.ValidationException;
import javax.validation.Validator;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/** Create by hyhweb on 2021/6/8 11:41 */
public class BeanValidator {
  /**
   * @param object
   * @param <T>
   */
  public static <T> void validate(T object) {
    Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
    Set<ConstraintViolation<T>> constraintViolations = validator.validate(object);
    if (CollectionUtils.isEmpty(constraintViolations)) {
      return;
    }
    throw new ValidationException(convertErrorMsg(constraintViolations));
  }

  public static <T> void validate(T object, Class<?>... group) {
    Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
    Set<ConstraintViolation<T>> constraintViolations = validator.validate(object, group);
    if (CollectionUtils.isEmpty(constraintViolations)) {
      return;
    }
    throw new ValidationException(convertErrorMsg(constraintViolations));
  }

  public static <T> String convertErrorMsg(Set<ConstraintViolation<T>> set) {
    Map<String, StringBuilder> errorMap = new HashMap<String, StringBuilder>();
    for (ConstraintViolation<T> cv : set) {
      String property = cv.getPropertyPath().toString();
      if (errorMap.get(property) != null) {
        StringBuilder sb = errorMap.get(property);
        sb.append("," + cv.getMessage());
      } else {
        StringBuilder sb = new StringBuilder();
        sb.append(cv.getMessage());
        errorMap.put(property, sb);
      }
    }

    return JSON.toJSONString(errorMap);
  }
}

4.在实体类中使用注释,例如@NotBlank的使用:

package com.lz.hehuorenservice.system.entity;

import com.lz.hehuorenservice.common.entity.BaseEntity;
import io.swagger.annotations.ApiModelProperty;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;

import javax.validation.constraints.NotBlank;
import java.util.*;

/** Create by hyhweb on 2021/6/6 16:24 */
public class User extends BaseEntity implements UserDetails {

  /** 用户主键ID */
  @ApiModelProperty(value = "用户主键ID")
  private Long userId;
  /** 用户名 */
  @NotBlank(message = "用户名不能为空")
  @ApiModelProperty(value = "用户名")
  private String userName;
  /** 用户密码 */
  @NotBlank(message = "用户密码不能为空")
  @ApiModelProperty(value = "用户密码")
  private String userPassword;
  }

5.在controller层调用自定义的验证方法BeanValidator.validate()进行验证对象,有验证不同就抛出异常。

  public ApiResult register(@RequestBody String json) throws Exception {
    UserRequest user = JSON.parseObject(json, UserRequest.class);
    BeanValidator.validate(user);
    return userService.register(user);
  }

6.处理验证ValidationException对象抛出的异常

package com.lz.hehuorenservice.common.exception;

import com.lz.hehuorenservice.common.response.ApiResult;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.multipart.MultipartException;

import javax.validation.ValidationException;

/** Create by hyhweb on 2021/6/1 19:03 */
@RestControllerAdvice
public class GlobalExceptionHandler {
 
  @ExceptionHandler(ValidationException.class)
  public ApiResult validationExceptionHandler(ValidationException e) {
    return ApiResult.fail(e.getMessage());
  }


}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值