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> constraintViolations = validator.validate(object, groups); if (!constraintViolations.isEmpty()) { ConstraintViolation 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(); } }