依赖
<dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>2.0.1.Final</version> </dependency> <dependency> <groupId>javax.el</groupId> <artifactId>javax.el-api</artifactId> <version>3.0.0</version> </dependency> <dependency> <groupId>org.glassfish.web</groupId> <artifactId>javax.el</artifactId> <version>2.2.6</version> </dependency> <dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> <version>6.0.11.Final</version> </dependency>
验证器相关类
/**
 * 验证器接口
 */
public interface Validator {
    /**
     * POJO实体验证
     * @param entity
     * @param <T>
     * @return
     */
    <T> List<ValidateResult> validateEntity(T entity);
    /**
     * 方法参数验证
     * @param obj
     * @param method
     * @param params
     * @param <T>
     * @return
     */
    <T> List<ValidateResult> validateMethodParams(T obj, Method method, Object[] params);
}
/**
 * 默认验证.javax.validation
 */
public class DefaultValidator implements Validator {
    private final ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
    private final ExecutableValidator executableValidator = factory.getValidator().forExecutables();
    private final javax.validation.Validator validator = factory.getValidator();
    @Override
    public <T> List<ValidateResult> validateEntity(T entity) {
        Set<ConstraintViolation<T>> violationSet = validator.validate(entity);
        return convert(violationSet);
    }
    @Override
    public <T> List<ValidateResult> validateMethodParams(T obj, Method method, Object[] params) {
        Set<ConstraintViolation<T>> violationSet = executableValidator.validateParameters(obj, method, params);
        return convert(violationSet);
    }
    protected <T> List<ValidateResult> convert(Set<ConstraintViolation<T>> violationSet){
        if (violationSet == null || violationSet.isEmpty())
            return null;
        List<ValidateResult> resultList = new ArrayList<>(violationSet.size());
        for (ConstraintViolation cv : violationSet){
            String name = cv.getPropertyPath().toString();
            resultList.add(new ValidateResult(name, cv.getMessage(), cv.getInvalidValue()));
        }
        return resultList;
    }
}
/**
 * 验证的结果
 */
public class ValidateResult {
    /**
     * 验证的字段名称
     */
    private String name;
    /**
     * 提示信息
     */
    private String msg;
    /**
     * 验证的值
     */
    private Object validatedVal;
    public ValidateResult(String name, String msg, Object validatedVal) {
        this.name = name;
        this.msg = msg;
        this.validatedVal = validatedVal;
    }
    @Override
    public String toString() {
        return "ValidateResult{" +
                "name='" + name + '\'' +
                ", msg='" + msg + '\'' +
                ", validatedVal=" + validatedVal +
                '}';
    }
}自定义验证器
import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
import static java.lang.annotation.ElementType.CONSTRUCTOR;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.ElementType.TYPE_USE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.Documented;
import java.lang.annotation.Repeatable;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.Payload;
/**
 * 自定义×××号码验证注解
 */
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Retention(RUNTIME)
@Repeatable(IDCardNumber.List.class)
@Documented
@Constraint(validatedBy = {IDCardNumberValidator.class})
public @interface IDCardNumber {
    String message() default "invalid IDCardNumber";
    Class<?>[] groups() default { };
    Class<? extends Payload>[] payload() default { };
    @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
    @Retention(RUNTIME)
    @Documented
    @interface List {
        IDCardNumber[] value();
    }
}
/**
 * IDCardNumber验证器
 */
public class IDCardNumberValidator implements ConstraintValidator<IDCardNumber, String> {
    @Override
    public void initialize(IDCardNumber constraintAnnotation) {
    }
    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        if (null == value || "".equals(value))
            return false;
        if (value.length() != 18)
            return false;
        if (getValidateCode(value) != value.toUpperCase().charAt(17))
            return false;
        return true;
    }
    /**
     * 十七位数字本体码权重
     */
    private static final int[] weight = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
    /**
     * mod11,对应校验码字符值
     */
    private static final char[] validate = {'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'};
    public char getValidateCode(String id17) {
        int sum = 0;
        int mode = 0;
        for (int i = 0; i < 17; i++) {
            //sum = sum + Integer.parseInt(String.valueOf(id17.charAt(i))) * weight[i];
            sum = sum + (id17.charAt(i) - 48) * weight[i];
        }
        mode = sum % 11;
        return validate[mode];
    }
}测试
@Valid
public class User {
    @NotNull(message = "id不能为空")
    private Integer id;
    private String name;
    @NotNull(message = "邮箱不能为空")
    @Email(message = "不合法的邮箱")
    private String email;
    @IDCardNumber(message = "无效×××")
    private String IDCardNumber;
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public String getIDCardNumber() {
        return IDCardNumber;
    }
    public void setIDCardNumber(String IDCardNumber) {
        this.IDCardNumber = IDCardNumber;
    }
    public void setField(@NotNull(message = "姓名不能为空") String name, @Range(min = 18, max = 60, message = "年龄只能在18至69岁") int age){}
}
public class Test {
    public static void main(String[] args) throws NoSuchMethodException {
        DefaultValidator defaultValidator = new DefaultValidator();
        User user = new User();
        user.setEmail("23424");
        user.setIDCardNumber("23424");
        List<ValidateResult> resultList = defaultValidator.validateEntity(user);
        System.out.println(resultList.toString());
        List<ValidateResult> validateResults = defaultValidator.validateMethodParams(user, user.getClass().getMethod("setField", String.class, int.class), new Object[]{null, 10});
        System.out.println(validateResults.toString());
    }
}输出结果
[ValidateResult{name='id', msg='id不能为空', validatedVal=null}, 
ValidateResult{name='IDCardNumber', msg='无效×××', validatedVal=23424}, 
ValidateResult{name='email', msg='不合法的邮箱', validatedVal=23424}]
[ValidateResult{name='setField.arg1', msg='年龄只能在18至69岁', validatedVal=10}, 
ValidateResult{name='setField.arg0', msg='姓名不能为空', validatedVal=null}]原文:http://blog.51cto.com/881206524/2150137