1.为什么使用hibernate注解校验?
2.使用hibernate
2.1 hibante常用校验注解
Bean Validation 中内置的 constraint
@Null 被注释的元素必须为 null
@NotNull 被注释的元素必须不为 null
@AssertTrue 被注释的元素必须为 true
@AssertFalse 被注释的元素必须为 false
@Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@DecimalMin(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@DecimalMax(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@Size(max=, min=) 被注释的元素的大小必须在指定的范围内
@Digits (integer, fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内
@Past 被注释的元素必须是一个过去的日期
@Future 被注释的元素必须是一个将来的日期
@Pattern(regex=,flag=) 被注释的元素必须符合指定的正则表达式
Hibernate Validator 附加的 constraint
@NotBlank(message =) 验证字符串非null,且长度必须大于0
@Email 被注释的元素必须是电子邮箱地址
@Length(min=,max=) 被注释的字符串的大小必须在指定的范围内
@NotEmpty 被注释的字符串的必须非空
@Range(min=,max=,message=) 被注释的元素必须在合适的范围内
2.2 依赖jar
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> </dependency>
2.3 简单使用注解校验
public class Customer { @NotBlank private String name;
}
测试是否能校验传入参数时 是否判断name为空
import javax.validation.ConstraintViolation; import javax.validation.Validation; import javax.validation.Validator; import java.util.Set; /** * author: xl * time: 2018/6/15 14:59 * description: **/ public class ValidatorTest { public static final Validator validator = Validation.buildDefaultValidatorFactory().getValidator(); /** * 〈注解验证参数〉 * * @param obj */ public static <T> String validate(T obj) { String msg = ""; Set<ConstraintViolation<T>> constraintViolations = validator.validate(obj); // 抛出检验异常 if (constraintViolations.size() > 0) { msg =constraintViolations.iterator().next().getMessage(); } return msg; } public static void main(String[] args) { Customer customer = new Customer(); customer.setAge(11); customer.setMobile("1581649786"); String validName = validate(customer); System.out.println(validName); } }
2.4 自定义注解校验
import javax.validation.Constraint; import javax.validation.Payload; import javax.validation.constraints.NotBlank; import javax.validation.constraints.Pattern; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * Created by xiaoli on 2018/6/15. */ @NotBlank @Pattern( regexp = "^(\\d{15,15}|\\d{18,18}|\\d{17}(\\d|X|x))", message = "不符合身份证格式" ) @Target({ElementType.TYPE,ElementType.FIELD,ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) //可指定校验类,如果不指定校验类则默认当前类 @Constraint( validatedBy = {} ) public @interface Idcard { String value()default "43112219871126"; String regexp() default "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9]+\\.[a-zA-Z]{2,4}"; String message()default "身份证校验失败"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; }
public class Customer { private String name; private int age; @Idcard private String idcard;
}
校验自定义注解
import javax.validation.ConstraintViolation; import javax.validation.Validation; import javax.validation.Validator; import java.util.Set; /** * author: xl * time: 2018/6/15 14:59 * description: **/ public class ValidatorTest { public static final Validator validator = Validation.buildDefaultValidatorFactory().getValidator(); /** * 分组校验和组合校验 * 不同的业务有不同的参数校验组合 * @param obj * @param groups * @param <T> */ public static <T> String validate(T obj,Class ... groups) { String msg = ""; Set<ConstraintViolation<T>> constraintViolations = validator.validate(obj); // 抛出检验异常 if (constraintViolations.size() > 0) { msg =constraintViolations.iterator().next().getMessage(); } return msg; } public static void main(String[] args) { Customer customer = new Customer(); customer.setName("xl"); customer.setAge(11); customer.setMobile("1581649786"); customer.setIdcard("4311122145845"); String validIdcard = validate(customer); System.out.println(validIdcard); } }
提供代码支持: hibernate annotation source code