提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- Spring Validation数据校验
- Spring Validation
- Spring 提供的数据校验方式:
- 依赖引入:
- Spring Validation常用的注解
- 手动校验:通过 "校验器+注解校验"
- 1.需要校验的类User
- 2.java原生校验器
- 使用java原生的 jakarta.validation.Validator校验器
- 3.spring提供的校验器
- 使用spring提供的 org.springframework.validation.Validator校验器
- JSRValidatorUtil
- 应用
Spring Validation数据校验
Spring Validation
Spring Validation是SpringFramework提供的一种轻量级的数据验证框架,用于Java对象进行校验。Spring Validation(Spring的数据验证组件)其实是一个抽象层,它为数据验证提供了统一的接口和基本的校验功能。Spring Validation默认使用了Hibernate Validator作为其具体的实现,但是也可以通过适配器与其他数据验证框架(如Apache Commons Validator)一起工作。
Spring Validation的主要功能包括:
1、提供了一套注解,用于对Java对象进行校验;
2、支持嵌套校验,用于对一个对象中的属性进行递归校验;
3、支持分组校验,用于根据不同的校验场景,使用不同的校验规则;
4、支持国际化,可以根据不同的语言环境,使用不同的校验提示消息。
5、支持自定义注解和校验器,满足各种复杂的校验需求。
Spring 提供的数据校验方式:
- 实现org.springframework.validation.Validator接口,调用接口实现类;
- 通过 注解 方式进行数据校验(按照Bean Validation方式);
- 基于 方法(函数) 实现数据校验;
- 自定义校验
依赖引入:
- 如果springboot版本小于2.3.x,spring-boot-web-starter会自动引入hibernate-validator。
- 如果spring-boot版本为2.3.x,则需要手动引入依赖
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>6.0.1.Final</version>
</dependency>
Spring Validation常用的注解
@NotNull:检查是否为null,不能为null。
@NotBlank:检查字符串是否为null或空字符串。
@NotEmpty:检查字符串、集合或数组是否为null或空。
@Min:检查数字是否大于等于指定值。
@Max:检查数字是否小于等于指定值。
@DecimalMin:检查数字是否大于等于指定值。
@DecimalMax:检查数字是否小于等于指定值。
@Size:检查字符串、集合或数组的长度是否在指定范围内。
@Digits:检查数字是否符合指定的精度和小数位数。
@Past:检查日期是否在当前时间之前。
@Future:检查日期是否在当前时间之后。
@Pattern:检查字符串是否匹配指定的正则表达式。
@Email:检查是否为有效的电子邮件地址。
@Length:检查字符串的长度是否在指定范围内。
@Range:检查数字是否在指定范围内。
@Positive:检查数字是否为正数。
@PositiveOrZero:检查数字是否为非负数。
@Negative:检查数字是否为负数。
@NegativeOrZero:检查数字是否为非正数。
@AssertTrue:检查是否为true。
@AssertFalse:检查是否为false。
@NotNull(message = “{user.name.notnull}”):使用国际化消息提示。
@NotBlank(message = “{user.name.notblank}”):使用国际化消息提示。
@NotEmpty(message = “{user.name.notempty}”):使用国际化消息提示。
@Email(message = “{user.email.format}”):使用国际化消息提示。
@Valid:用于嵌套校验,可以对一个对象中的属性进行递归校验。
@ConvertGroup:用于分组校验,可以指定校验的分组,根据不同的分组执行不同的校验规则。
@GroupSequence:用于定义校验分组的顺序,指定不同分组的执行顺序。
手动校验:通过 “校验器+注解校验”
1.需要校验的类User
import jakarta.validation.constraints.Max;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotNull;@Data
public class User {@NotEmpty //不可为空private String name;@Min(0) //最小值@Max(110) //最大值private int age;
}
2.java原生校验器
使用java原生的 jakarta.validation.Validator校验器
import jakarta.validation.ConstraintViolation;
import jakarta.validation.Validator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Set;/*** 使用java原生的jakarta.validation.Validator校验* */
@Service
public class JavaService {@Autowired //自动装配Validator对象private Validator validator;//校验方法public boolean validator(User user){//校验后的结果存放进Set集合Set<ConstraintViolation<User>> set = validator.validate(user);//若没有校验到错误,集合为空,返回true。return set.isEmpty();}
}
3.spring提供的校验器
使用spring提供的 org.springframework.validation.Validator校验器
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.validation.BindException;
import org.springframework.validation.Validator;/*** 使用spring提供的validate校验方法*/
@Service
public class SpringService {@Autowiredprivate Validator validator;public boolean validator2(User user){BindException bindException = new BindException(user,user.getName());validator.validate(user,bindException); //调用校验方法进行校验System.out.println(bindException.getAllErrors()); //输出所有错误信息return bindException.hasErrors(); //若没有异常,返回false}
}
JSRValidatorUtil
import com.tuzhanai.framework.error.BaseError;
import com.tuzhanai.framework.error.SystemError;
import com.tuzhanai.framework.exception.AppException;
import lombok.extern.slf4j.Slf4j;
import org.hibernate.validator.HibernateValidator;import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import java.util.Set;@Slf4j
public class JSRValidatorUtil {private final static Validator VALIDATOR = Validation.byProvider(HibernateValidator.class).configure().buildValidatorFactory().getValidator();public static <T> void validate(T param, Class<?>... groups) {Set<ConstraintViolation<T>> validate = VALIDATOR.validate(param, groups);validate.forEach(v -> {log.error("JSR校验异常,property:{},message:{}", v.getPropertyPath(), v.getMessage());throw new AppException(new BaseError() {@Overridepublic Integer getErrorCode() {return SystemError.PARSE_PARAMS_FAIL.getErrorCode();}@Overridepublic String getErrorMsg() {return v.getMessage();}});});}
}
应用
public String syncPreExport(SyncExportDTO syncExportDTO, HttpServletResponse response, HttpServletRequest request) throws Exception {GoodsMediaReportReqDTO dto = ObjectMapperUtil.convert(syncExportDTO.getDto(), GoodsMediaReportReqDTO.class);if (null == dto) {throw new AppException(SystemError.PARSE_PARAMS_FAIL);}try {JSRValidatorUtil.validate(dto);} catch (Exception e) {throw new IllegalArgumentException("请检查配置是否存在必填项为空!");}