package xiaozhi.common.validator;
|
|
import java.util.Locale;
|
import java.util.Set;
|
import java.util.regex.Pattern;
|
|
import org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator;
|
import org.springframework.context.i18n.LocaleContextHolder;
|
import org.springframework.context.support.ResourceBundleMessageSource;
|
import org.springframework.validation.beanvalidation.MessageSourceResourceBundleLocator;
|
|
import jakarta.validation.ConstraintViolation;
|
import jakarta.validation.Validation;
|
import jakarta.validation.Validator;
|
import xiaozhi.common.exception.RenException;
|
|
/**
|
* hibernate-validator校验工具类
|
* 参考文档:http://docs.jboss.org/hibernate/validator/6.0/reference/en-US/html_single/
|
*/
|
public class ValidatorUtils {
|
|
private static ResourceBundleMessageSource getMessageSource() {
|
ResourceBundleMessageSource bundleMessageSource = new ResourceBundleMessageSource();
|
bundleMessageSource.setDefaultEncoding("UTF-8");
|
bundleMessageSource.setBasenames("i18n/validation");
|
return bundleMessageSource;
|
}
|
|
/**
|
* 校验对象
|
*
|
* @param object 待校验对象
|
* @param groups 待校验的组
|
*/
|
public static void validateEntity(Object object, Class<?>... groups)
|
throws RenException {
|
Locale.setDefault(LocaleContextHolder.getLocale());
|
Validator validator = Validation.byDefaultProvider().configure().messageInterpolator(
|
new ResourceBundleMessageInterpolator(new MessageSourceResourceBundleLocator(getMessageSource())))
|
.buildValidatorFactory().getValidator();
|
|
Set<ConstraintViolation<Object>> constraintViolations = validator.validate(object, groups);
|
if (!constraintViolations.isEmpty()) {
|
ConstraintViolation<Object> constraint = constraintViolations.iterator().next();
|
throw new RenException(constraint.getMessage());
|
}
|
}
|
|
/**
|
* 国际手机号正则表达式
|
* 要求必须带国际区号,格式:+[国家代码][手机号]
|
* 例如:
|
* - +8613800138000
|
* - +12345678900
|
* - +447123456789
|
*/
|
private static final String INTERNATIONAL_PHONE_REGEX = "^\\+[1-9]\\d{0,3}[1-9]\\d{4,14}$";
|
|
/**
|
* 校验手机号是否有效
|
* 要求必须带国际区号,格式:+[国家代码][手机号]
|
* 例如:+8613800138000
|
*
|
* @param phone 手机号
|
* @return boolean
|
*/
|
public static boolean isValidPhone(String phone) {
|
if (phone == null || phone.isEmpty()) {
|
return false;
|
}
|
|
// 验证必须带国际区号的手机号格式
|
Pattern pattern = Pattern.compile(INTERNATIONAL_PHONE_REGEX);
|
return pattern.matcher(phone).matches();
|
}
|
}
|