service层触发校验规则 Validation
场景
针对与同一个参数实体类,很多时候需要根据不同的业务,对参数进行不同的校验规则。
如用的都是User实体类,针对用户信息完善的业务,手机号可有可无。但是针对客户及联系人信息更新,则用户信息的手机号就是必填的。
常用校验注解
@Null 限制只能为null
@NotNull 限制必须不为null
@AssertFalse 限制必须为false
@AssertTrue 限制必须为true
@DecimalMax(value) 限制必须为一个不大于指定值的数字
@DecimalMin(value) 限制必须为一个不小于指定值的数字
@Digits(integer,fraction) 限制必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction
@Future 限制必须是一个将来的日期
@Max(value) 限制必须为一个不大于指定值的数字
@Min(value) 限制必须为一个不小于指定值的数字
@Past 限制必须是一个过去的日期
@Pattern(value) 限制必须符合指定的正则表达式
@Size(max,min) 限制字符长度必须在min到max之间
@Past 验证注解的元素值(日期类型)比当前时间早
@NotEmpty 验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0)
@NotBlank 验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的空格
@Email 验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email
具体应用
public class OrderDTO {
/**
* 物料编号
*/
@NotNull(message = "订单编号不能为空")
private String orderId;
/**
* 物料编号
*/
@NotNull(message = "规格编号不能为空")
private String specId;
/**
* 物料数量
*/
@NotNull(message = "数量不能为空")
// @DecimalMin(value="0",message="数量不能小于0")
@NumberThanMin(message="数量必须大于0!")
private Double quantity;
/**
* 子订单
*/
private List<SubOrderDTO> subList;
/**
* 操作人
*/
@NotNull(message = "操作人 不能为空")
private String operator;
/**
* 操作时间
*/
@NotNull(message = "操作时间 不能为空")
//@Pattern(message = "时间格式错误",regexp = "^((([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))-02-29))\\s+([0-1]?[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$")
private LocalDateTime operationTime;
public OrderDTO () {
}
}
service层或手动触发校验规则
定义一个工具类:ValidatorUtil
package com.yyc.deliver.util;
import com.yyc.common.dto.ResultCode;
import com.yyc.common.exception.BusinessException;
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;
/**
* @author
* @description:
* @date 2021/7/29
*/
@Slf4j
public class ValidatorUtil {
private static final Validator VALIDATOR = Validation.byProvider(HibernateValidator.class).configure()
.failFast(true).buildValidatorFactory().getValidator();
/**
* 实体校验
*
* @param obj 校验对象
*/
public static <T> void validate(T obj) {
Set<ConstraintViolation<T>> constraintViolations = VALIDATOR.validate(obj);
if (constraintViolations.size() > 0) {
ConstraintViolation<T> validateInfo = constraintViolations.iterator().next();
// validateInfo.getMessage() 校验不通过时的信息,即message对应的值
log.error(validateInfo.getMessage());
throw new BusinessException(validateInfo.getMessage(),ResultCode.FAIL.code);
}
}
}
然后在方法中需要校验的地方用工具类调用即可:
OrderDTO dto = new OrderDTO();
ValidatorUtil.validate(dto);